caffe finetuning时从源模型到目的模型:将一个layer的参数赋予到多个layer

在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.";
    }
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值