極智AI | caffe proto 校驗模型結構 prototxt 講解

語言: CN / TW / HK

  一起養成寫作習慣!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第12天,點選檢視活動詳情

歡迎關注我的公眾號 [極智視界],獲取我的更多筆記分享

  大家好,我是極智視界,本文講解一下 caffe proto 怎麼校驗模型結構 prototxt 檔案。

  深度學習模型的格式特別多,基本不同框架都會有一套自己的模型結構,如 pytroch 的 pth、tensorflow 的 pb、caffe 的 prototxt 和 weights、darknet 的 cfg 和 weights,還有一些想做大一統的模型結構,如 onnx (不想吐槽)。定義模型的方式千千萬,不過萬變不離其宗,模型檔案只有兩個東西:一個 graph,還有個就是權重。在開源的一些模型結構中,個人最喜歡的是 caffe 用的 google 的 prototxt 去定義模型結構,其主要原因有三個:(1) 結構清晰;(2) 節省了很多程式碼開發量;(3) 可校驗 (這真的非常重要)。

1 ubuntu 安裝 protobuf

  protobuf (protocol buffer) 是谷歌內部的混合資料標準,通過將結構化的資料進行序列化,用於通訊協議、資料儲存等領域的語言無關、平臺無關、可擴充套件的序列化結構資料格式,所以特別適合深度學習模型這種結構化、有跨平臺移植需要的資料結構。

  下面進行 protobuf 的安裝:

```shell

安裝依賴

sudo apt-get install autoconf automake libtool curl make g++ unzip libffi-dev -y

clone pro

git clone --recursive https://gitee.com/jeremyjj/protobuf.git

編譯 C++ 介面

cd protobuf ./autogen.sh ./configure sudo make -j32 sudo make install

重新整理共享庫

sudo ldconfig

驗證一下

protoc --version

編譯 python 介面

cd python

python setup.py build python setup.py test python setup.py install

驗證一下

$ python

import google.protobuf ```

  以上就安裝好了 protobuf 環境。

2 caffe proto 校驗 prototxt

  來看 caffe proto 怎麼校驗 prototxt 的,當然這很容易擴充套件到其他領域。

  首先定義一個 caffe.proto:

```protobuf syntax = "proto2";

package caffe; //c++ namespace

message NetParameter { optional string name = 1; // consider giving the network a name repeated LayerParameter layer = 2; // ID 100 so layers are printed last. }

// LayerParameter next available layer-specific ID: 147 (last added: recurrent_param) message LayerParameter { optional string name = 1; // the layer name optional string type = 2; // the layer type repeated string bottom = 3; // the name of each bottom blob repeated string top = 4; // the name of each top blob optional ConvolutionParameter convolution_param = 106; optional DataParameter data_param = 106; }

message ConvolutionParameter { optional uint32 num_output = 1; // The number of outputs for the layer

// Pad, kernel size, and stride are all given as a single value for equal // dimensions in all spatial dimensions, or once per spatial dimension. repeated uint32 pad = 3; // The padding size; defaults to 0 repeated uint32 kernel_size = 4; // The kernel size repeated uint32 stride = 6; // The stride; defaults to 1 }

message DataParameter { optional string module = 1; optional string layer = 2; optional string param_str = 3 [default = '']; } ```

  編譯生成 caffe.pb.cc 與 caffe.pb.h 檔案:

shell // --cpp_out=. 表示在當前目錄生成cpp檔案及標頭檔案 protoc caffe.proto --cpp_out=.

  然後定義一下測試模型檔案 text.prototxt:

```protobuf name: "testModel" layer { name: 'inputdata' type: 'Data' top: 'data' python_param { module: 'data.layer' layer: 'DataLayer' param_str: "'num_classes': 2" } }

layer { name: "conv1_1" type: "Convolution" bottom: "inputdata" top: "conv1_1" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } convolution_param { num_output: 64 pad: 1 kernel_size: 3 } } ```

  編寫測試 cpp:

```c++

include

include

include

include

include

include

include

include "caffe.pb.h"

using namespace caffe; using namespace std;

using google::protobuf::io::FileInputStream; using google::protobuf::Message; bool ReadProtoFromTextFile(const char filename, Message proto) { int fd = open(filename, O_RDONLY); FileInputStream* input = new FileInputStream(fd); bool success = google::protobuf::TextFormat::Parse(input, proto); delete input; close(fd); return success; }

int main(){ NetParameter TESTModel; if(!ReadProtoFromTextFile("test.prototxt", &VGG16)) { cout<<"error opening file"<<endl; return -1; } cout << TESTModel.name() << endl; return 0; } ```

  然後進行編譯,生成可執行程式 main:

shell g++ caffe.pb.cc main.cpp -o main -lprotobuf

  最後執行 ./main 就能正常執行並得到輸出,這裡是輸出了 test.prototxt 中的 name,即 "testModel" 字串。

  到這裡好像還沒說怎麼校驗的,簡單說一下應該就能懂:我們最開始定義了 caffe.proto,裡面定義了層、引數該怎麼寫,相當於提供了一個編寫模型結構的規則,所以我們在測試模型 test.prototxt 中都是按照這個規則去寫的,一旦你沒有按這個規則去寫,在讀你的 prototxt 就會丟擲報錯,相當於提醒你:你寫錯了,回去檢查一下吧。

  好了,以上分享了 caffe proto 校驗模型結構 prototxt 的方法。希望我的分享能對你的學習有一點幫助。


 【公眾號傳送】

《極智AI | caffe proto 校驗模型結構 prototxt 講解》


logo_show.gif