2017-03-24 11 views
0

私はC++で私の機械学習にcaffeを使用しました。caffeでレイヤーのブロブ情報を抽出するには?

net_->Forward();という名前のネットワークを通過した後、私は個々の層の情報を抽出するのが好きです。私が何をしたか

  net_->Forward(); 

      //Extract layer information 
      cout << "Num layers:" << "'" << net_->layer_names().size() << "'"<< endl; 
      for (int layer_index = 0; layer_index < net_->layer_names().size(); ++layer_index) 
      { 
       // get that layer blob and its dimension 
       const boost::shared_ptr<Blob<float> > blob = net_->blob_by_name(net_->blob_names()[layer_index]); 
       int batch_size = blob->num();     
       int dim_features = blob->count()/batch_size; 
       std::cout << "Layer name:" << "'" << net_->layer_names()[layer_index] << "'" << " Blob name:" << "'" <<net_->blob_names()[layer_index] << "'" << " batch size " << "'" << batch_size << "'" << " dim_features:" << "'" << dim_features << "'" << std::endl; 
      } 

は、私はすべてのレイヤ名と寸法を見ることができました。

Layer name'image' Blob name'image' batch_size'1' dim_features'921600' 
Layer name'conv1/7x7_s2' Blob name'conv1/7x7_s2' batch_size'1' dim_features'4915200' 
Layer name'conv1/relu_7x7' Blob name'pool1/3x3_s2' batch_size'1' dim_features'1228800' 
Layer name'pool1/3x3_s2' Blob name'pool1/norm1' batch_size'1' dim_features'1228800' 
Layer name'pool1/norm1' Blob name'conv2/3x3_reduce' batch_size'1' dim_features'1228800' 
Layer name'conv2/3x3_reduce' Blob name'conv2/3x3' batch_size'1' dim_features'3686400' 
Layer name'conv2/relu_3x3_reduce' Blob name'conv2/norm2' batch_size'1' dim_features'3686400' 

しかし、ここではさらに深い情報が必要です。現在の寸法は921600です

、それはバッチサイズxチャンネル×高さ×幅で構成されている= 921600.

(1)だから私の最初のクエリが情報を分割する方法ですか?

(2)私は、この情報バッチサイズxチャネル×高さ×幅を有していると言う= X 480 X 640 1×3そして

1×1×480×640のようなBLOBの各レイヤを抽出する方法

、私は印刷するか、プロットすることができます。

私は

for layer_name, blob in net.blobs.iteritems(): 
     print layer_name + '\t' + str(blob.data.shape) 
      mydata = net.blobs[layer_name].data[0,0,:,:] 
      #cv2.imshow("mydata",mydata); 
      #cv2.waitKey(1) 
      layer_name = layer_name.replace('/', '_') 
      np.savetxt("printdata/"+layer_name+".csv", mydata, delimiter=",") 

のように、Pythonで行うことができます。しかし、今のところ、私はC++でやりたいそういったこと。質問1については

答えて

1

あなたはblob.hppファイルに見れば、それはブロブの大きさを取得するには、いくつかの方法があります。 const vector<int>&を返すshape()か、num(),channels()height()width()などの非推奨のメソッドを呼び出して、intを返すことができます。層が3つのチャンネルを持っているなら、あなたがイメージとして表示するには、この操作を行うことができ :質問2について

int batch_size = blob->num(); 
int channels = blob->channels(); 
int height = blob->height(); 
int width = blob->width(); 
std::cout << "Layer name:" << "'" << net_->layer_names()[layer_index] << "'" << " Blob name:" << "'" <<net_->blob_names()[layer_index] << "'" << " batch size " << "'" << batch_size << "'" << " channels:" << "'" << channels << "'" << " height:" << "'" << height << "'" << " width:" << "'" << width << "'" << std::endl; 

編集:だからあなたの場合のために、それは次のようにする必要があります

// assign channels 
std::vector<cv::Mat> ccs; 
cv::Size ss(width, height); 
float* data = blob->mutable_cpu_data(); 
for (int i = 0; i < channels; ++i) { 
    cv::Mat channel(ss, CV_32FC1, data); 
    ccs.push_back(channel); 
    data += ss.area(); 
} 
cv::Mat res,dst; 
// merge them 
cv::merge(ccs, res); 
// optional add mean if needed 
cv::normalize(res, dst, 0, 1, cv::NORM_MINMAX); 
cv::namedWindow("Display window"); 
cv::imshow("Display window", dst); 
cv::waitKey(0); 
+0

I同じことをしました。しかし、私はcv :: Mat a(blob-> height()、blob-> width()、CV_32FC1、blob-> data_at(0,1,0,0))のように黒い画像を取得します。何か問題でも? – batuman

+0

私はここでの質問を理解していません。私はあなたがブロブの次元情報だけを望むと思った。ブロブから画像を見せたいですか? – lnman

+0

私の2番目の質問にY – batuman

関連する問題