在net.cpp中
template <typename Dtype>
void Net<Dtype>::CopyTrainedLayersFrom(const NetParameter& param) {
int num_source_layers = param.layers_size();
vector<bool> layer_init_flag(layer_names_.size(), false);
for (int i = 0; i < num_source_layers; ++i) {
const LayerParameter& source_layer = param.layers(i);
const string& source_layer_name = source_layer.name();
//我修改并highlight的内容。
std::vector<int> total_target_shot;
total_target_shot.clear();
for(int target_layer_id = 0; target_layer_id < layer_names_.size();++target_layer_id){
if(layer_names_[target_layer_id] == source_layer_name ||
layer_names_[target_layer_id] == (source_layer_name+"_sec") ){
total_target_shot.push_back(target_layer_id);
}
}
if (!total_target_shot.size()) {
DLOG(INFO) << "Ignoring source layer " << source_layer_name;
continue;
}
for(int shot_ = 0; shot_ < total_target_shot.size();++shot_){
int target_id = total_target_shot[shot_];
layer_init_flag[target_id] = true;
DLOG(INFO) << "Copying source layer " << source_layer_name;
vector<shared_ptr<Blob<Dtype> > >& target_blobs =
layers_[target_id]->blobs();
CHECK_EQ(target_blobs.size(), source_layer.blobs_size())
<< "Incompatible number of blobs for layer " << source_layer_name;
const bool strict_dim = layers_[target_id]->layer_param().strict_dim();
for (int j = 0; j < target_blobs.size(); ++j) {
if (strict_dim) {
CHECK_EQ(target_blobs[j]->num(), source_layer.blobs(j).num())
<< "Incompatible parameter size for layer " << source_layer_name;
CHECK_EQ(target_blobs[j]->channels(), source_layer.blobs(j).channels())
<< "Incompatible parameter size for layer " << source_layer_name;
CHECK_EQ(target_blobs[j]->height(), source_layer.blobs(j).height())
<< "Incompatible parameter size for layer " << source_layer_name;
CHECK_EQ(target_blobs[j]->width(), source_layer.blobs(j).width())
<< "Incompatible parameter size for layer " << source_layer_name;
target_blobs[j]->FromProto(source_layer.blobs(j));
}
else {
CHECK_EQ(target_blobs[j]->count(), source_layer.blobs(j).num() * source_layer.blobs(j).channels()
* source_layer.blobs(j).height() * source_layer.blobs(j).width())
<< "Incompatible number of blobs for layer " << source_layer_name;
BlobProto blob_copy = source_layer.blobs(j);
blob_copy.set_num(target_blobs[j]->num());
blob_copy.set_channels(target_blobs[j]->channels());
blob_copy.set_height(target_blobs[j]->height());
blob_copy.set_width(target_blobs[j]->width());
target_blobs[j]->FromProto(blob_copy);
}
}
}
}
for (int i = 0; i < layer_names_.size(); ++i) {
if (!layer_init_flag[i] && layers_[i]->blobs().size()) {
LOG(INFO) << "Target layer " << layer_names_[i] << " not initialized.";
}
}
}