caffe

定義CAFFE爲caffe跟目錄,caffe的核心代碼都在$CAFFE/src/caffe 下,主要有如下部分:net, blob, layer, solver.網絡

    • net.cpp
      net定義網絡, 整個網絡中含有不少layers, net.cpp負責計算整個網絡在訓練中的forward, backward過程, 即計算forward/backward 時各layer的gradient。

      函數

    • layers
      在$CAFFE/src/caffe/layers中的層,在protobuffer (.proto文件中定義message類型,.prototxt或.binaryproto文件中定義message的值) 中調用時包含屬性name, type(data/conv/pool…), connection structure (input blobs and output blobs),layer-specific parameters(如conv層的kernel大小)。定義一個layer須要定義其setup, forward 和backward過程。

      spa

    • blob.cpp
      net中的數據和求導結果經過4維的blob傳遞。一個layer有不少blobs, e.g,ci

      • 對data,weight blob大小爲Number * Channels * Height * Width, 如256*3*224*224;
      • 對conv層,weight blob大小爲 Output 節點數 * Input 節點數 * Height * Width,如AlexNet第一個conv層的blob大小爲96 x 3 x 11 x 11;
      • 對inner product 層, weight blob大小爲 1 * 1 * Output節點數 * Input節點數; bias blob大小爲1 * 1 * 1 * Output節點數( conv層和inner product層同樣,也有weight和bias,因此在網絡結構定義中咱們會看到兩個blobs_lr,第一個是weights的,第二個是bias的。相似地,weight_decay也有兩個,一個是weight的,一個是bias的); 


        blob中,mutable_cpu/gpu_data() 和cpu/gpu_data()用來管理memory,cpu/gpu_diff()和 mutable_cpu/gpu_diff()用來計算求導結果。

    • slover.cpp
      結合loss,用gradient更新weights。主要函數: 
      Init(), 
      Solve(), 
      ComputeUpdateValue(), 
      Snapshot(), Restore(),//快照(拷貝)與恢復 網絡state 
      Test();

      在solver.cpp中有3中solver,即3個類:AdaGradSolverSGDSolverNesterovSolver可供選擇。

      關於loss,能夠同時有多個loss,能夠加regularization(L1/L2);input

相關文章
相關標籤/搜索