深度學習caffe數據結構(二)—— Blob實例練習

        Blob是caffe中最基本的數據結構,是caffe的磚石,在本文中我們通過一個實例對Blob進行初步認識,並掌握Blob的基本操作。這個實例的源碼blob_demo.cpp,如下所示

#include <vector>
#include <iostream>
#include <caffe/blob.hpp>
using namespace caffe;
using namespace std;
int main(void)
{
  Blob<float> bb;
  cout<<"Size : "<< bb.shape_string()<<endl;
  bb.Reshape(2, 2, 3, 3);
  cout<<"Size : "<< bb.shape_string()<<endl;
  float * p1 = bb.mutable_cpu_data();
  float * p2 = bb.mutable_cpu_diff();
  for(int i = 0; i < bb.count(); i++)
  {
    p1[i] = i;	               // 將 data 初始化爲 0,1, 2, 3,……
    p2[i] = bb.count() - 1 - i; // 將 diff 初始化爲 35, 34, 33,……
  }
  
  for(int u = 0; u < bb.num(); u++)
  {
    for(int v = 0; v < bb.channels(); v++)
    {
      for(int w = 0; w < bb.height(); w++)
      {
        for(int x = 0; x < bb.width(); x++)
        {
          cout<<"bb["<<u<<"]["<<v<<"]["<<w<<"]["<<x<<"] = "<< bb.data_at(u, v, w, x)<<endl;
        }
      }
    }
  } 
  
  cout<<"ASUM = "<<bb.asum_data()<<endl;
  cout<<"SUMSQ = "<<bb.sumsq_data()<<endl;

  
  bb.Update();// 執行 Update 操作

  for(int u = 0; u < bb.num(); u++)
  {
    for(int v = 0; v < bb.channels(); v++)
    {
      for(int w = 0; w < bb.height(); w++)
      {
        for(int x = 0; x < bb.width(); x++)
        {
          cout<<"bb["<<u<<"]["<<v<<"]["<<w<<"]["<<x<<"] = "<< bb.data_at(u, v, w, x)<<endl;
        }
      }
    }
  } 
  
  cout<<"ASUM = "<<bb.asum_data()<<endl;
  cout<<"SUMSQ = "<<bb.sumsq_data()<<endl;

  return 0;
}

        在這個程序中,首先實例化了一個Blob對象bb,然後打印bb的尺寸,之後重新定義bb的尺寸,並打印bb的尺寸。重新定義bb的尺寸相當於給bb分配了一部分內存。然後定義float型的指針p1和p2,分別指向bb的數data和偏差diff。

        接下來,通過一個for循環,給data和diff賦值,分別爲0~35的值,和35~0的值。然後將blob的data的值打印出來,之後計算Blob所有元素絕對值之和(L1範數)以及所有元素的平方和(L2範數)。並打印範數的值。

        最後調用Blob的Update方法,Update方法用來更新data的值,它實際上是將data與diff加和之後再賦給data。更新完之後再次打印所有元素的值,以及L1和L2範數的值。

        通過下面的命令編譯代碼

g++ -o blob_demo blob_demo.cpp -I /home/bigmarshal/Documents/deep_learning/caffe/include/ -D CPU_ONLY -I /home/bigmarshal/Documents/deep_learning/caffe/.build_release/src/ -L /home/bigmarshal/Documents/deep_learning/caffe/build/lib/ -lcaffe -lglog

上邊命令中的路徑需要根據自己電腦的caffe路徑進行設置。

在運行程序的可執行文件之前,執行下面的命令。

export LD_LIBRARY_PATH=/home/bigmarshal/Documents/deep_learning/caffe/build/lib/:$LD_LIBRARY_PATH

這個命令的作用是添加環境變量。

然後用下面的命令運行程序。

./blob_demo

程序的執行結果如下所示。

Size : (0)
Size : 2 2 3 3 (36)
bb[0][0][0][0] = 0
bb[0][0][0][1] = 1
bb[0][0][0][2] = 2
bb[0][0][1][0] = 3
bb[0][0][1][1] = 4
bb[0][0][1][2] = 5
bb[0][0][2][0] = 6
bb[0][0][2][1] = 7
bb[0][0][2][2] = 8
bb[0][1][0][0] = 9
bb[0][1][0][1] = 10
bb[0][1][0][2] = 11
bb[0][1][1][0] = 12
bb[0][1][1][1] = 13
bb[0][1][1][2] = 14
bb[0][1][2][0] = 15
bb[0][1][2][1] = 16
bb[0][1][2][2] = 17
bb[1][0][0][0] = 18
bb[1][0][0][1] = 19
bb[1][0][0][2] = 20
bb[1][0][1][0] = 21
bb[1][0][1][1] = 22
bb[1][0][1][2] = 23
bb[1][0][2][0] = 24
bb[1][0][2][1] = 25
bb[1][0][2][2] = 26
bb[1][1][0][0] = 27
bb[1][1][0][1] = 28
bb[1][1][0][2] = 29
bb[1][1][1][0] = 30
bb[1][1][1][1] = 31
bb[1][1][1][2] = 32
bb[1][1][2][0] = 33
bb[1][1][2][1] = 34
bb[1][1][2][2] = 35
ASUM = 630
SUMSQ = 14910
bb[0][0][0][0] = -35
bb[0][0][0][1] = -33
bb[0][0][0][2] = -31
bb[0][0][1][0] = -29
bb[0][0][1][1] = -27
bb[0][0][1][2] = -25
bb[0][0][2][0] = -23
bb[0][0][2][1] = -21
bb[0][0][2][2] = -19
bb[0][1][0][0] = -17
bb[0][1][0][1] = -15
bb[0][1][0][2] = -13
bb[0][1][1][0] = -11
bb[0][1][1][1] = -9
bb[0][1][1][2] = -7
bb[0][1][2][0] = -5
bb[0][1][2][1] = -3
bb[0][1][2][2] = -1
bb[1][0][0][0] = 1
bb[1][0][0][1] = 3
bb[1][0][0][2] = 5
bb[1][0][1][0] = 7
bb[1][0][1][1] = 9
bb[1][0][1][2] = 11
bb[1][0][2][0] = 13
bb[1][0][2][1] = 15
bb[1][0][2][2] = 17
bb[1][1][0][0] = 19
bb[1][1][0][1] = 21
bb[1][1][0][2] = 23
bb[1][1][1][0] = 25
bb[1][1][1][1] = 27
bb[1][1][1][2] = 29
bb[1][1][2][0] = 31
bb[1][1][2][1] = 33
bb[1][1][2][2] = 35
ASUM = 648
SUMSQ = 15540

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章