| 680 | |
| 681 | template <typename Dtype> |
| 682 | void Net<Dtype>::ShareTrainedLayersWith(const Net* other) { |
| 683 | int num_source_layers = other->layers().size(); |
| 684 | for (int i = 0; i < num_source_layers; ++i) { |
| 685 | Layer<Dtype>* source_layer = other->layers()[i].get(); |
| 686 | const string& source_layer_name = other->layer_names()[i]; |
| 687 | int target_layer_id = 0; |
| 688 | while (target_layer_id != layer_names_.size() && |
| 689 | layer_names_[target_layer_id] != source_layer_name) { |
| 690 | ++target_layer_id; |
| 691 | } |
| 692 | if (target_layer_id == layer_names_.size()) { |
| 693 | LOG(INFO) << "Ignoring source layer " << source_layer_name; |
| 694 | continue; |
| 695 | } |
| 696 | DLOG(INFO) << "Copying source layer " << source_layer_name; |
| 697 | vector<shared_ptr<Blob<Dtype> > >& target_blobs = |
| 698 | layers_[target_layer_id]->blobs(); |
| 699 | CHECK_EQ(target_blobs.size(), source_layer->blobs().size()) |
| 700 | << "Incompatible number of blobs for layer " << source_layer_name; |
| 701 | for (int j = 0; j < target_blobs.size(); ++j) { |
| 702 | Blob<Dtype>* source_blob = source_layer->blobs()[j].get(); |
| 703 | CHECK(target_blobs[j]->shape() == source_blob->shape()) |
| 704 | << "Cannot share param " << j << " weights from layer '" |
| 705 | << source_layer_name << "'; shape mismatch. Source param shape is " |
| 706 | << source_blob->shape_string() << "; target param shape is " |
| 707 | << target_blobs[j]->shape_string(); |
| 708 | target_blobs[j]->ShareData(*source_blob); |
| 709 | } |
| 710 | } |
| 711 | } |
| 712 | |
| 713 | template <typename Dtype> |
| 714 | void Net<Dtype>::BackwardFrom(int start) { |