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);
}
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 {
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.";
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());
}
}
}
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.
//
// 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
"lr_policy: 'fixed' "
"net_param { "
" name: 'TestNetwork' "
- " layers: { "
+ " layer { "
" name: 'data' "
" type: 'DummyData' "
" dummy_data_param { "
" top: 'data' "
" top: 'targets' "
" } "
- " layers: { "
+ " layer { "
" name: 'innerprod' "
" type: 'InnerProduct' "
" inner_product_param { "
" bottom: 'data' "
" top: 'innerprod' "
" } "
- " layers: { "
+ " layer { "
" name: 'loss' "
" type: 'EuclideanLoss' "
" bottom: 'innerprod' "
const bool accuracy_layer = false) {
string proto =
"name: 'TinyTestNetwork' "
- "layers: { "
+ "layer { "
" name: 'data' "
" type: 'DummyData' "
" dummy_data_param { "
" top: 'data' "
" top: 'label' "
"} "
- "layers: { "
+ "layer { "
" name: 'innerproduct' "
" type: 'InnerProduct' "
" inner_product_param { "
" 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' "
"} ";
if (accuracy_layer) {
proto +=
- "layers: { "
+ "layer { "
" name: 'loss' "
" type: 'Accuracy' "
" bottom: 'innerproduct' "
virtual void InitTinyNetEuclidean(const bool force_backward = false) {
string proto =
"name: 'TinyTestEuclidLossNetwork' "
- "layers: { "
+ "layer { "
" name: 'data' "
" type: 'DummyData' "
" dummy_data_param { "
" top: 'data' "
" top: 'label' "
"} "
- "layers: { "
+ "layer { "
" name: 'innerproduct' "
" type: 'InnerProduct' "
" inner_product_param { "
" 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' "
}
const string& proto =
"name: 'TrickyTestNetwork' "
- "layers: { "
+ "layer { "
" name: 'data' "
" type: 'DummyData' "
" dummy_data_param { "
" top: 'data' "
" top: 'label' "
"} "
- "layers: { "
+ "layer { "
" name: 'innerproduct' "
" type: 'InnerProduct' "
" inner_product_param { "
" 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 { "
" 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() +
proto << "force_backward: true ";
}
proto <<
- "layers: { "
+ "layer { "
" name: 'data' "
" type: 'DummyData' "
" dummy_data_param { "
" } "
" top: 'data' "
"} "
- "layers: { "
+ "layer { "
" name: 'innerproduct1' "
- " type: 'InnerProduct' "
+ " type: 'InnerProduct' "
" inner_product_param { "
" num_output: 10 "
" bias_term: " << bias_term <<
" 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' "
}
proto <<
"} "
- "layers: { "
+ "layer { "
" name: 'innerproduct2' "
" type: 'InnerProduct' "
" inner_product_param { "
" 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) {
virtual void InitSharedWeightsNet() {
const string& proto =
"name: 'SharedWeightsNetwork' "
- "layers: { "
+ "layer { "
" name: 'data' "
" type: 'DummyData' "
" dummy_data_param { "
" } "
" top: 'data' "
"} "
- "layers: { "
+ "layer { "
" name: 'innerproduct1' "
" type: 'InnerProduct' "
" inner_product_param { "
" std: 10 "
" } "
" } "
- " param: 'sharedweights' "
+ " param { name: 'sharedweights' } "
" bottom: 'data' "
" top: 'innerproduct1' "
"} "
- "layers: { "
+ "layer { "
" name: 'innerproduct2' "
" type: 'InnerProduct' "
" inner_product_param { "
" std: 10 "
" } "
" } "
- " param: 'sharedweights' "
+ " param { name: 'sharedweights' } "
" bottom: 'data' "
" top: 'innerproduct2' "
"} "
- "layers: { "
+ "layer { "
" name: 'loss' "
" type: 'EuclideanLoss' "
" bottom: 'innerproduct1' "
virtual void InitDiffDataUnsharedWeightsNet() {
const string& proto =
"name: 'DiffDataUnsharedWeightsNetwork' "
- "layers: { "
+ "layer { "
" name: 'data' "
" type: 'DummyData' "
" dummy_data_param { "
" top: 'data1' "
" top: 'data2' "
"} "
- "layers: { "
+ "layer { "
" name: 'innerproduct1' "
" type: 'InnerProduct' "
" inner_product_param { "
" value: 0.5 "
" } "
" } "
- " param: 'unsharedweights1' "
+ " param { name: 'unsharedweights1' } "
" bottom: 'data1' "
" top: 'innerproduct1' "
"} "
- "layers: { "
+ "layer { "
" name: 'innerproduct2' "
" type: 'InnerProduct' "
" inner_product_param { "
" value: 0.5 "
" } "
" } "
- " param: 'unsharedweights2' "
+ " param { name: 'unsharedweights2' } "
" bottom: 'innerproduct1' "
" top: 'innerproduct2' "
"} "
- "layers: { "
+ "layer { "
" name: 'loss' "
" type: 'EuclideanLoss' "
" bottom: 'data2' "
virtual void InitDiffDataSharedWeightsNet() {
const string& proto =
"name: 'DiffDataSharedWeightsNetwork' "
- "layers: { "
+ "layer { "
" name: 'data' "
" type: 'DummyData' "
" dummy_data_param { "
" top: 'data1' "
" top: 'data2' "
"} "
- "layers: { "
+ "layer { "
" name: 'innerproduct1' "
" type: 'InnerProduct' "
" inner_product_param { "
" value: 0.5 "
" } "
" } "
- " param: 'sharedweights' "
+ " param { name: 'sharedweights' } "
" bottom: 'data1' "
" top: 'innerproduct1' "
"} "
- "layers: { "
+ "layer { "
" name: 'innerproduct2' "
" type: 'InnerProduct' "
" inner_product_param { "
" value: 0.5 "
" } "
" } "
- " param: 'sharedweights' "
+ " param { name: 'sharedweights' } "
" bottom: 'innerproduct1' "
" top: 'innerproduct2' "
"} "
- "layers: { "
+ "layer { "
" name: 'loss' "
" type: 'EuclideanLoss' "
" bottom: 'data2' "
"input_dim: 3 "
"input_dim: 100 "
"input_dim: 100 "
- "layers: { "
+ "layer { "
" name: 'conv1' "
" type: 'Convolution' "
" bottom: 'data' "
" } "
" } "
"} "
- "layers: { "
+ "layer { "
" name: 'relu1' "
" type: 'ReLU' "
" bottom: 'conv1' "
" top: 'conv1' "
"} "
- "layers: { "
+ "layer { "
" name: 'pool1' "
" type: 'Pooling' "
" bottom: 'conv1' "
" stride: 2 "
" } "
"} "
- "layers: { "
+ "layer { "
" name: 'norm1' "
" type: 'LRN' "
" bottom: 'pool1' "
" local_size: 3 "
" } "
"} "
- "layers: { "
+ "layer { "
" name: 'softmax' "
" type: 'Softmax' "
" bottom: 'norm1' "
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' "
TEST_F(FilterNetTest, TestFilterLeNetTrainTest) {
const string& input_proto =
"name: 'LeNet' "
- "layers { "
+ "layer { "
" name: 'mnist' "
" type: 'Data' "
" top: 'data' "
" } "
" include: { phase: TRAIN } "
"} "
- "layers { "
+ "layer { "
" name: 'mnist' "
" type: 'Data' "
" top: 'data' "
" } "
" 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 "
" } "
" } "
"} "
- "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 { "
" } "
" } "
"} "
- "layers { "
+ "layer { "
" name: 'accuracy' "
" type: 'Accuracy' "
" bottom: 'ip1' "
" top: 'accuracy' "
" include: { phase: TEST } "
"} "
- "layers { "
+ "layer { "
" name: 'loss' "
" type: 'SoftmaxWithLoss' "
" bottom: 'ip2' "
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' "
" } "
" 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 "
" } "
" } "
"} "
- "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 { "
" } "
" } "
"} "
- "layers { "
+ "layer { "
" name: 'loss' "
" type: 'SoftmaxWithLoss' "
" bottom: 'ip2' "
"} ";
const string& output_proto_test =
"name: 'LeNet' "
- "layers { "
+ "layer { "
" name: 'mnist' "
" type: 'Data' "
" top: 'data' "
" } "
" 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 "
" } "
" } "
"} "
- "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 { "
" } "
" } "
"} "
- "layers { "
+ "layer { "
" name: 'accuracy' "
" type: 'Accuracy' "
" bottom: 'ip1' "
" top: 'accuracy' "
" include: { phase: TEST } "
"} "
- "layers { "
+ "layer { "
" name: 'loss' "
" type: 'SoftmaxWithLoss' "
" bottom: 'ip2' "
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' "
"} ";
const string& output_proto =
"name: 'TestNetwork' "
- "layers: { "
+ "layer { "
" name: 'innerprod' "
" type: 'InnerProduct' "
" bottom: 'data' "
" top: 'innerprod' "
"} "
- "layers: { "
+ "layer { "
" name: 'loss' "
" type: 'SoftmaxWithLoss' "
" bottom: 'innerprod' "
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' "
"} ";
const string& output_proto =
"name: 'TestNetwork' "
- "layers: { "
+ "layer { "
" name: 'data' "
" type: 'Data' "
" top: 'data' "
" top: 'label' "
"} "
- "layers: { "
+ "layer { "
" name: 'loss' "
" type: 'SoftmaxWithLoss' "
" bottom: 'innerprod' "
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' "
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' "
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' "
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' "
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' "
" include: { stage: 'myotherstage' } "
" include: { stage: 'mystage' } "
"} "
- "layers: { "
+ "layer { "
" name: 'loss' "
" type: 'SoftmaxWithLoss' "
" bottom: 'innerprod' "
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' "
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' "
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' "
const string& output_proto =
"state: { stage: 'mystage' } "
"name: 'TestNetwork' "
- "layers: { "
+ "layer { "
" name: 'data' "
" type: 'Data' "
" top: 'data' "
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' "
"} ";
const string& output_proto =
"name: 'TestNetwork' "
- "layers: { "
+ "layer { "
" name: 'data' "
" type: 'Data' "
" top: 'data' "
" top: 'label' "
"} "
- "layers: { "
+ "layer { "
" name: 'loss' "
" type: 'SoftmaxWithLoss' "
" bottom: 'innerprod' "
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' "
"} ";
const string& output_proto =
"name: 'TestNetwork' "
- "layers: { "
+ "layer { "
" name: 'data' "
" type: 'Data' "
" top: 'data' "
" top: 'label' "
"} "
- "layers: { "
+ "layer { "
" name: 'loss' "
" type: 'SoftmaxWithLoss' "
" bottom: 'innerprod' "
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' "
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' "
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' "
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' "
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' "
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' "
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' "
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' "
" include: { min_level: 2 phase: TRAIN } "
" include: { phase: TEST } "
"} "
- "layers: { "
+ "layer { "
" name: 'loss' "
" type: 'SoftmaxWithLoss' "
" bottom: 'innerprod' "
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' "
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' "
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' "
"test_state: {}"
"net_param { "
" name: 'TestNetwork' "
- " layers: { "
+ " layer { "
" name: 'data' "
" type: 'DummyData' "
" dummy_data_param { "
" top: 'data' "
" top: 'label' "
" } "
- " layers: { "
+ " layer { "
" name: 'innerprod' "
" type: 'InnerProduct' "
" inner_product_param { "
" bottom: 'data' "
" top: 'innerprod' "
" } "
- " layers: { "
+ " layer { "
" name: 'accuracy' "
" type: 'Accuracy' "
" bottom: 'innerprod' "
" top: 'accuracy' "
" exclude: { phase: TRAIN } "
" } "
- " layers: { "
+ " layer { "
" name: 'loss' "
" type: 'SoftmaxWithLoss' "
" bottom: 'innerprod' "
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' "
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' "
TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) {
const string& input_proto =
"name: 'CaffeNet' "
- "layers { "
+ "layer { "
" name: 'data' "
" type: 'Data' "
" data_param { "
" top: 'data' "
" top: 'label' "
"} "
- "layers { "
+ "layer { "
" name: 'conv1' "
" type: 'Convolution' "
" convolution_param { "
" 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 { "
" bottom: 'conv1' "
" top: 'pool1' "
"} "
- "layers { "
+ "layer { "
" name: 'norm1' "
" type: 'LRN' "
" lrn_param { "
" bottom: 'pool1' "
" top: 'norm1' "
"} "
- "layers { "
+ "layer { "
" name: 'conv2' "
" type: 'Convolution' "
" convolution_param { "
" 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 { "
" bottom: 'conv2' "
" top: 'pool2' "
"} "
- "layers { "
+ "layer { "
" name: 'norm2' "
" type: 'LRN' "
" lrn_param { "
" bottom: 'pool2' "
" top: 'norm2' "
"} "
- "layers { "
+ "layer { "
" name: 'conv3' "
" type: 'Convolution' "
" convolution_param { "
" 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 { "
" 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 { "
" 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 { "
" bottom: 'conv5' "
" top: 'pool5' "
"} "
- "layers { "
+ "layer { "
" name: 'fc6' "
" type: 'InnerProduct' "
" inner_product_param { "
" 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 { "
" bottom: 'fc6' "
" top: 'fc6' "
"} "
- "layers { "
+ "layer { "
" name: 'fc7' "
" type: 'InnerProduct' "
" inner_product_param { "
" 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 { "
" bottom: 'fc7' "
" top: 'fc7' "
"} "
- "layers { "
+ "layer { "
" name: 'fc8' "
" type: 'InnerProduct' "
" inner_product_param { "
" 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' "
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' "
const string& input_proto =
"name: 'UnsharedWeightsNetwork' "
"force_backward: true "
- "layers: { "
+ "layer { "
" name: 'data' "
" type: 'DummyData' "
" dummy_data_param { "
" } "
" top: 'data' "
"} "
- "layers: { "
+ "layer { "
" name: 'innerproduct1' "
" type: 'InnerProduct' "
" inner_product_param { "
" std: 10 "
" } "
" } "
- " param: 'unsharedweights1' "
+ " param { name: 'unsharedweights1' } "
" bottom: 'data' "
" top: 'innerproduct1' "
" loss_weight: 2.5 "
"} "
- "layers: { "
+ "layer { "
" name: 'innerproduct2' "
" type: 'InnerProduct' "
" inner_product_param { "
" std: 10 "
" } "
" } "
- " param: 'unsharedweights2' "
+ " param { name: 'unsharedweights2' } "
" bottom: 'data' "
" top: 'innerproduct2' "
"} "
- "layers: { "
+ "layer { "
" name: 'loss' "
" type: 'EuclideanLoss' "
" bottom: 'innerproduct1' "
const string& expected_output_proto =
"name: 'UnsharedWeightsNetwork' "
"force_backward: true "
- "layers: { "
+ "layer { "
" name: 'data' "
" type: 'DummyData' "
" dummy_data_param { "
" } "
" 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 { "
" 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' "
" loss_weight: 2.5 "
" loss_weight: 0 "
"} "
- "layers: { "
+ "layer { "
" name: 'innerproduct2' "
" type: 'InnerProduct' "
" inner_product_param { "
" 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' "
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' "
"} ";
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_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' "
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' "
"} ";
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' "
"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' "
"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' "
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' "
"} ";
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' "
" 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' "
"} "
" 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' "
"} "
" 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' "
"} "
" 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' "
"} "
" 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' "
"} "
" 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' "
"} "
" 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' "
"} "
" 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' "
"} "
" 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' "
"} "
" 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' "
"} "
}
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())) {
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));