2017-10-30 1 views
2

深い学習のためにCaffeを使用しています。私のプログラムはC++です。Caffeディープラーニングプロセスの個々の層の出力をC++で視覚化する方法は?

net_->Forward(&loss);でフォワードを繰り返すたびに、prototxtファイルで定義されているすべてのレイヤーを通過させ、どのように各レイヤーの出力をC++で可視化できますか?

net.cpp内のファイル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どのように表示できますか?

+0

"ビジュアライズ"とは具体的にはどういう意味ですか?計画?画像?数?ベクトル? – Shai

+0

['ForwardDebugInfo(...)'と 'BackwardDebugInfo(...)'](https://github.com/BVLC/caffe/blob/master/src/caffe/net.cpp#L585)を見ましたか? -L636)各レイヤーの[debug info](https://stackoverflow.com/q/40510706/1714410)を出力する関数はありますか? – Shai

+0

@Shaiはいイメージを印刷したいです。はい、良い考えですね。私はそこに斑点を描くことができると思う。私が試してみましょう。 – batuman

答えて

0

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; 
    } 
関連する問題