caffe proto文件,和配置文件


caffe proto文件,和配置文件

要看caffe源碼,我認為首先應該看的就是caffe.proto。 
它位於…\src\caffe\proto目錄下,在這個文件夾下還有一個.pb.cc和一個.pb.h文件,這兩個文件都是由caffe.proto編譯而來的。 
在caffe.proto中定義了很多結構化數據,包括:

  • BlobProto
  • BlobShape
  • BlobProtoVector
  • Datum
  • FillerParameter
  • NetParameter
  • SolverParameter
  • SolverState
  • NetStateRule
  • ParamSpec
  • LayerParameter
  • TransformationParameter
  • optional AccuracyParameter accuracy_param = 102;
      optional ArgMaxParameter argmax_param = 103;
      optional ConcatParameter concat_param = 104;
      optional ContrastiveLossParameter contrastive_loss_param = 105;
      optional ConvolutionParameter convolution_param = 106;
      optional DataParameter data_param = 107;
      optional DropoutParameter dropout_param = 108;
      optional DummyDataParameter dummy_data_param = 109;
      optional EltwiseParameter eltwise_param = 110;
      optional ExpParameter exp_param = 111;
      optional HDF5DataParameter hdf5_data_param = 112;
      optional HDF5OutputParameter hdf5_output_param = 113;
      optional HingeLossParameter hinge_loss_param = 114;
      optional ImageDataParameter image_data_param = 115;
      optional InfogainLossParameter infogain_loss_param = 116;
      optional InnerProductParameter inner_product_param = 117;
      optional LRNParameter lrn_param = 118;
      optional MemoryDataParameter memory_data_param = 119;
      optional MVNParameter mvn_param = 120;
      optional PoolingParameter pooling_param = 121;
      optional PowerParameter power_param = 122;
      optional PReLUParameter prelu_param = 131;
      optional PythonParameter python_param = 130;
      optional ReLUParameter relu_param = 123;
      optional SigmoidParameter sigmoid_param = 124;
      optional SoftmaxParameter softmax_param = 125;
      optional SliceParameter slice_param = 126;
      optional TanHParameter tanh_param = 127;
      optional ThresholdParameter threshold_param = 128;
      optional WindowDataParameter window_data_param = 129;
  • V0LayerParameter

正文

一、什么是protocol buffer

以下內容摘自:Google Protocol Buffer 的使用和原理 
強烈推薦另外一篇極好的博文是:Protocol Buffer技術詳解(C++實例)

簡介

什么是 Google Protocol Buffer? 假如您在網上搜索,應該會得到類似這樣的文字介紹: 
Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內部的混合語言數據標准,目前已經正在使用的有超過 48,162 種報文格式定義和超過 12,183 個 .proto 文件。他們用於 RPC 系統和持續數據存儲系統。 
Protocol Buffers 是一種輕便高效的結構化數據存儲格式,可以用於結構化數據串行化,或者說序列化。它很適合做數據存儲或 RPC 數據交換格式。可用於通訊協議、數據存儲等領域的語言無關、平台無關、可擴展的序列化結構數據格式。目前提供了 C++、Java、Python 三種語言的 API。 
或許您和我一樣,在第一次看完這些介紹后還是不明白 Protobuf 究竟是什么,那么我想一個簡單的例子應該比較有助於理解它。

一個簡單的例子

安裝 Google Protocol Buffer 
在網站 http://code.google.com/p/protobuf/downloads/list上可以下載 Protobuf 的源代碼。然后解壓編譯安裝便可以使用它了。 
安裝步驟如下所示:

<code class="hljs go has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> tar -xzf protobuf<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">-2.1</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>.tar.gz cd protobuf<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">-2.1</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span> ./configure --prefix=$INSTALL_DIR <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">make</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">make</span> check <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">make</span> install</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; "><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

關於簡單例子的描述

我打算使用 Protobuf 和 C++ 開發一個十分簡單的例子程序。 
該程序由兩部分組成。第一部分被稱為 Writer,第二部分叫做 Reader。 
Writer 負責將一些結構化的數據寫入一個磁盤文件,Reader 則負責從該磁盤文件中讀取結構化數據並打印到屏幕上。 
准備用於演示的結構化數據是 HelloWorld,它包含兩個基本數據:

  • ID,為一個整數類型的數據
  • Str,這是一個字符串

書寫 .proto 文件

首先我們需要編寫一個 proto 文件,定義我們程序中需要處理的結構化數據,在 protobuf 的術語中,結構化數據被稱為 Message。proto 文件非常類似 java 或者 C 語言的數據定義。代碼清單 1 顯示了例子應用中的 proto 文件內容。 
清單 1. proto 文件

<code class="hljs go has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">package</span> lm; message helloworld { required <span class="hljs-typename" style="color: rgb(102, 0, 102); box-sizing: border-box;">int32</span> id =<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"> 1</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// ID </span> required <span class="hljs-typename" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> str =<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"> 2</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// str </span> optional <span class="hljs-typename" style="color: rgb(102, 0, 102); box-sizing: border-box;">int32</span> opt =<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"> 3</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//optional field </span> }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; "><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

一個比較好的習慣是認真對待 proto 文件的文件名。比如將命名規則定於 
packageName.MessageName.proto 
在上例中,package 名字叫做 lm,定義了一個消息 helloworld,該消息有三個成員,類型為 int32 的 id,另一個為類型為 string 的成員 str。opt 是一個可選的成員,即消息中可以不包含該成員。

編譯 .proto 文件

寫好 proto 文件之后就可以用 Protobuf 編譯器將該文件編譯成目標語言了。本例中我們將使用 C++。 
假設您的 proto 文件存放在 $SRC_DIR 下面,您也想把生成的文件放在同一個目錄下,則可以使用如下命令:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">protoc <span class="hljs-attribute" style="box-sizing: border-box;">-I</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$SRC_DIR</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">--</span>cpp_out<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$DST_DIR</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$SRC_DIR</span>/addressbook<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>proto</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; "><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

命令將生成兩個文件: 
lm.helloworld.pb.h , 定義了 C++ 類的頭文件 
lm.helloworld.pb.cc , C++ 類的實現文件 
在生成的頭文件中,定義了一個 C++ 類 helloworld,后面的 Writer 和 Reader 將使用這個類來對消息進行操作。諸如對消息的成員進行賦值,將消息序列化等等都有相應的方法。

編寫 writer 和 Reader

如前所述,Writer將把一個結構化數據寫入磁盤,以便其他人來讀取。假如我們不使用 Protobuf,其實也有許多的選擇。一個可能的方法是將數據轉換為字符串,然后將字符串寫入磁盤。轉換為字符串的方法可以使用sprintf(),這非常簡單。數字123可以變成字符串“123”。 
這樣做似乎沒有什么不妥,但是仔細考慮一下就會發現,這樣的做法對寫 Reader 的那個人的要求比較高,Reader 的作者必須了 Writer 的細節。比如”123”可以是單個數字 123,但也可以是三個數字 1,2 和 3,等等。這么說來,我們還必須讓 Writer 定義一種分隔符一樣的字符,以便 Reader 可以正確讀取。但分隔符也許還會引起其他的什么問題。最后我們發現一個簡單的 Helloworld 也需要寫許多處理消息格式的代碼。 
如果使用 Protobuf,那么這些細節就可以不需要應用程序來考慮了。 
使用 Protobuf,Writer 的工作很簡單,需要處理的結構化數據由 .proto 文件描述,經過上一節中的編譯過程后,該數據化結構對應了一個 C++ 的類,並定義在 lm.helloworld.pb.h 中。對於本例,類名為 lm::helloworld。 
Writer 需要 include 該頭文件,然后便可以使用這個類了。 
現在,在 Writer 代碼中,將要存入磁盤的結構化數據由一個 lm::helloworld 類的對象表示,它提供了一系列的 get/set 函數用來修改和讀取結構化數據中的數據成員,或者叫 field。 
當我們需要將該結構化數據保存到磁盤上時,類 lm::helloworld 已經提供相應的方法來把一個復雜的數據變成一個字節序列,我們可以將這個字節序列寫入磁盤。 
對於想要讀取這個數據的程序來說,也只需要使用類 lm::helloworld 的相應反序列化方法來將這個字節序列重新轉換會結構化數據。這同我們開始時那個“123”的想法類似,不過 Protobuf 想的遠遠比我們那個粗糙的字符串轉換要全面,因此,我們不如放心將這類事情交給 Protobuf 吧。 
程序清單 2 演示了 Writer 的主要代碼,您一定會覺得很簡單吧? 
清單 2. Writer 的主要代碼

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">#include</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"lm.helloworld.pb.h"</span> … int main(<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">void</span>) { lm<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::helloworld</span> msg1; msg1<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>set_id(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">101</span>); msg1<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>set_str(“hello”); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Write the new address book back to disk. </span> fstream output(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"./log"</span>, ios<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::out</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">|</span> ios<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::trunc</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">|</span> ios<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::binary</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">!</span>msg1<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>SerializeToOstream(<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">&</span>output)) { cerr <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><<</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Failed to write msg."</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><<</span> endl; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; "><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul>

Msg1 是一個 helloworld 類的對象,set_id() 用來設置 id 的值。SerializeToOstream 將對象序列化后寫入一個 fstream 流。 
代碼清單 3 列出了 reader 的主要代碼。 
清單 3. Reader

<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include "lm.helloworld.pb.h" </span> … <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> ListMsg(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> lm::helloworld & msg) { <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span> << msg.id() << endl; <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span> << msg.str() << endl; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> main(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> argc, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span>* argv[]) { lm::helloworld msg1; { fstream input(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"./log"</span>, ios::in | ios::binary); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (!msg1.ParseFromIstream(&input)) { <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cerr</span> << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Failed to parse address book."</span> << endl; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; } } ListMsg(msg1); … }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; "><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li></ul>

同樣,Reader 聲明類 helloworld 的對象 msg1,然后利用 ParseFromIstream 從一個 fstream 流中讀取信息並反序列化。此后,ListMsg 中采用 get 方法讀取消息的內部信息,並進行打印輸出操作。 
運行結果 
運行 Writer 和 Reader 的結果如下:

<code class="hljs tex has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\></span>writer <span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\></span>reader 101 Hello</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; "><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

Reader 讀取文件 log 中的序列化信息並打印到屏幕上。本文中所有的例子代碼都可以在附件中下載。您可以親身體驗一下。 
這個例子本身並無意義,但只要您稍加修改就可以將它變成更加有用的程序。比如將磁盤替換為網絡 socket,那么就可以實現基於網絡的數據交換任務。而存儲和交換正是 Protobuf 最有效的應用領域。

二、caffe.proto中的幾個重要數據類型

看完了上面關於protocol buffer的介紹,大家應該可以知道其實caffe.pb.cc里面的東西都是從caffe.proto編譯而來的,無非就是一些關於這些數據結構(類)的標准化操作,比如

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> CopyFrom(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> MergeFrom(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> CopyFrom(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> MergeFrom; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> Clear(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> IsInitialized() <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> ByteSize() <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> MergePartialFromCodedStream(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> SerializeWithCachedSizes() <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span>; SerializeWithCachedSizesToArray() <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> GetCachedSize() <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> SharedCtor(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> SharedDtor(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> SetCachedSize() <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; "><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

<0> BlobProto

<code class="hljs vala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">message BlobProto {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//blob的屬性以及blob中的數據(data\diff)</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int32</span> num = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]; optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int32</span> channels = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]; optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int32</span> height = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]; optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int32</span> width = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]; repeated <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> data = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span> [packed = <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>]; repeated <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> diff = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span> [packed = <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>]; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; "><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

<1> Datum

<code class="hljs vala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> message Datum { optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int32</span> channels = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int32</span> height = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>; optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int32</span> width = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>; optional bytes data = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//真實的圖像數據,以字節存儲(bytes)</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int32</span> label = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>; repeated <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> float_data = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//datum也能存float類型的數據(float)</span> }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; "><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

<2> LayerParameter

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">message LayerParameter { repeated <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">string</span> bottom = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//輸入的blob的名字(string)</span> repeated <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">string</span> top = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//輸出的blob的名字(string)</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">string</span> name = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//層的名字</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">enum</span> LayerType { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//層的枚舉(enum,和c++中的enum一樣)</span> NONE = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; ACCURACY = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; BNLL = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>; CONCAT = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>; CONVOLUTION = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>; DATA = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>; DROPOUT = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span>; EUCLIDEAN_LOSS = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>; ELTWISE_PRODUCT = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">25</span>; FLATTEN = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>; HDF5_DATA = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span>; HDF5_OUTPUT = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>; HINGE_LOSS = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">28</span>; IM2COL = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">11</span>; IMAGE_DATA = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12</span>; INFOGAIN_LOSS = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">13</span>; INNER_PRODUCT = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">14</span>; LRN = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">15</span>; MEMORY_DATA = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">29</span>; MULTINOMIAL_LOGISTIC_LOSS = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">16</span>; POOLING = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">17</span>; POWER = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">26</span>; RELU = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">18</span>; SIGMOID = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">19</span>; SIGMOID_CROSS_ENTROPY_LOSS = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">27</span>; SOFTMAX = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20</span>; SOFTMAX_LOSS = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">21</span>; SPLIT = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">22</span>; TANH = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">23</span>; WINDOW_DATA = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">24</span>; } optional LayerType type = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 層的類型</span> repeated BlobProto blobs = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//blobs的數值參數</span> repeated <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> blobs_lr = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//學習速率(repeated),如果你想那個設置一個blob的學習速率,你需要設置所有blob的學習速率。</span> repeated <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> weight_decay = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//權值衰減(repeated)</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 相對於某一特定層的參數(optional)</span> optional ConcatParameter concat_param = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span>; optional ConvolutionParameter convolution_param = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>; optional DataParameter data_param = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">11</span>; optional DropoutParameter dropout_param = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12</span>; optional HDF5DataParameter hdf5_data_param = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">13</span>; optional HDF5OutputParameter hdf5_output_param = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">14</span>; optional ImageDataParameter image_data_param = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">15</span>; optional InfogainLossParameter infogain_loss_param = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">16</span>; optional InnerProductParameter inner_product_param = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">17</span>; optional LRNParameter lrn_param = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">18</span>; optional MemoryDataParameter memory_data_param = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">22</span>; optional PoolingParameter pooling_param = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">19</span>; optional PowerParameter power_param = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">21</span>; optional WindowDataParameter window_data_param = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20</span>; optional V0LayerParameter layer = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; "><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li></ul>

<3> NetParameter

<code class="hljs vala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">message NetParameter { optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">string</span> name = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//網絡的名字</span> repeated LayerParameter layers = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//repeated類似於數組</span> repeated <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">string</span> input = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//輸入層blob的名字</span> repeated <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int32</span> input_dim = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//輸入層blob的維度,應該等於(4*#input)</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> force_backward = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span> [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span> = <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span>];<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//網絡是否進行反向傳播。如果設置為否,則由網絡的結構和學習速率來決定是否進行反向傳播。</span> }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; "><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

<4> SolverParameter

<code class="hljs vala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">message SolverParameter { optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">string</span> train_net = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 訓練網絡的proto file</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">string</span> test_net = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 測試網絡的proto file</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int32</span> test_iter = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 每次測試時的迭代次數</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int32</span> test_interval = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 兩次測試的間隔迭代次數</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> test_compute_loss = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">19</span> [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span> = <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span>]; optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> base_lr = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 基本學習率</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int32</span> display = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 兩次顯示的間隔迭代次數</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int32</span> max_iter = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 最大迭代次數</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">string</span> lr_policy = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 學習速率衰減方式</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> gamma = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 關於梯度下降的一個參數</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> power = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 計算學習率的一個參數</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> momentum = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">11</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 動量</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> weight_decay = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 權值衰減</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int32</span> stepsize = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">13</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 學習速率的衰減步長</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int32</span> snapshot = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">14</span> [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// snapshot的間隔</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">string</span> snapshot_prefix = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">15</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// snapshot的前綴</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> snapshot_diff = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">16</span> [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span> = <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span>]; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 是否對於 diff 進行 snapshot</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">enum</span> SolverMode { <span class="hljs-constant" style="box-sizing: border-box;"> CPU </span>= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; <span class="hljs-constant" style="box-sizing: border-box;"> GPU </span>= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; } optional SolverMode solver_mode = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">17</span> [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span> = GPU]; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// solver的模式,默認為GPU</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int32</span> device_id = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">18</span> [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// GPU的ID</span> optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int64</span> random_seed = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20</span> [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span> = -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 隨機數種子</span> }</code>
 
0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM