如何在 C++ 中可视化 Caffe 深度学习过程的各个层输出?

How to visualize Caffe deep learning process's individual layer output in C++?

我正在使用 Caffe 进行深度学习。我的程序是用 C++ 编写的。

net_->Forward(&loss); 处的每次 forward 迭代,我们都会遍历 prototxt 文件中定义的所有层,以及如何在 C++ 中可视化每个层的输出。

Inside net.cpp file inside Caffe library,这个循环迭代逐层转发。

template <typename Dtype>
Dtype Net<Dtype>::ForwardFromTo(int start, int end) {
  CHECK_GE(start, 0);
  CHECK_LT(end, layers_.size());
  Dtype loss = 0;
  for (int i = start; i <= end; ++i) {
    //cout << "Forwarding " << layer_names_[i] << endl;     
    Dtype layer_loss = layers_[i]->Forward(bottom_vecs_[i], top_vecs_[i]);
    loss += layer_loss;
    if (debug_info_) { ForwardDebugInfo(i); }
  }
  return loss;
}

top_vecs_[i] is output of each layer 我如何将其可视化?

根据Shai的建议,我的做法是ForwardDebugInfo().

for (int top_id = 0; top_id < top_vecs_[layer_id].size(); ++top_id) {
        Blob<Dtype>& blob = *top_vecs_[layer_id][top_id];    
        const string& blob_name = blob_names_[top_id_vecs_[layer_id][top_id]];
            string name = blob_name;
            for (int i = 0; i < name.length(); ++i) {
               if (name[i] == '/')
                   name[i] = '_';
            }
            string foldname = "images/"+name;
            if (stat(foldname.c_str(), &st) == -1) {
                mkdir(foldname.c_str(), 0700);
            }
        //cout<<"blob_name " << blob_name << " layer_id is " << layer_id << " blob.num() " << blob.num() << " blob.channels() " << blob.channels() << " blob.height() " << blob.height() << " blob.width() " << blob.width() << endl;

        ///////Plotting output of individual layer
        if(blob.height()>1 && blob.width()>1){
            cv::Size ss(blob.width(), blob.height());
            Dtype* data = blob.mutable_cpu_data();
            for(int k=0; k < blob.channels(); k++)
            {
              cv::Mat channel(ss, CV_32FC1, data);
              stringstream s;
              s << k;
              cv::imwrite(foldname+"/"+s.str()+".jpg",channel*255.0);         
              channel.release();
              data += ss.area();
            }
        }


       // mainImg.release();

        /////////////////////////////////////////
        const Dtype data_abs_val_mean = blob.asum_data() / blob.count();
        LOG_IF(INFO, Caffe::root_solver())
            << "    [Forward] "
            << "Layer " << layer_names_[layer_id]
            << ", top blob " << blob_name
            << " data: " << data_abs_val_mean;
  }