caffe(六)主函式解析

2021-08-15 09:21:26 字數 2622 閱讀 8783

tools/caffe.cpp

登錄檔

首先定義乙個登錄檔,

typedef

int (*brewfunction)();

typedef

std::map

string, brewfunction> brewmap;

brewmap g_brew_map;

#define registerbrewfunction(func) \

namespace \

}; \

__registerer_##func g_registerer_##func; \

}

之後用registerbrewfunction註冊了train,test和timer, 這裡說明一下,這是在main函式之前就已經執行完了的,

main函式

之後main函式如下,

int main(int argc, char** argv)  catch (bp::error_already_set) 

#endif

} else

}

getbrewfunction

開始呼叫getbrewfunction函式,

static brewfunction

getbrewfunction(const caffe:

:string& name) else

log(fatal) << "unknown action: "

<< name;

return

null; //

not reachable, just to suppress old compiler warnings.

}}

比如caffe的引數為 train –solver=examples/mnist/lenet_solver.prototxt,那麼argv[1]為train,argv[2]為–solver=examples/mnist/lenet_solver.prototxt, 在main函式中傳入getbrewfunction的形參為train,因而根據getbrewfunction的功能,會執行train函式,

train

train函式最重要的其實就只有三行,

shared_ptr:solver >

solver(caffe:

:solverregistry

::createsolver(solver_param)); // 根據solver_param建立一solver,呼叫的是solver_factory 的工廠函式,這時solver的初始化會呼叫net的初始化,就會列印網路 的資訊和部署網路,這個時候呼叫createsolver不會建立新的登錄檔,只會返回與solver_param對應的solver類,至於為什麼這樣,可以從solver_factory中得到,

solver->setactionfunction(signal_handler.getactionfunction()); // 規定動作,是從0開始訓練還是從訓練的 中間開始

solver->solve(); // solver開始訓練,迭代…

test

test函式是把模型正向跑一遍,不去跑反向,下面是註解

// instantiate the caffe net.

net caffe_net(flags_model, caffe::test, flags_level, &stages);

caffe_net.copytrainedlayersfrom(flags_weights);

log(info) << "running for "

<< flags_iterations << " iterations.";

vector

test_score_output_id; // test_score_output_id裡面也放了n個數,這n個數依次是網路輸出 blob的id

vector

test_score; // test score 裡面只記錄n個數,n代表的輸出blob的個數,

float loss = 0;

for (int i = 0; i < flags_iterations; ++i) else

const

std::string& output_name = caffe_net.blob_names()[

caffe_net.output_blob_indices()[j]];

log(info) << "batch "

<< i << ", "

<< output_name << " = "

<< score;}}

} loss /= flags_iterations;

log(info) << "loss: "

<< loss;

for (int i = 0; i < test_score.size(); ++i)

log(info) << output_name << " = "

<< mean_score << loss_msg_stream.str();

}

cacacafca

Caffe實踐 損失函式解析

在有監督的機器學習中,需要有標籤資料,與此同時,也需要有對應的損失函式 loss function 在caffe中,目前已經實現了一些損失函式,包括最常見的l2損失函式,對比損失函式,資訊增益損失函式等等。在這裡做乙個筆記,歸納總結caffe中用到的不同的損失函式,以及分析它們各自適合的使用場景。輸...

Caffe中的損失函式解析

在有監督的機器學習中,需要有標籤資料,與此同時,也需要有對應的損失函式 loss function 在caffe中,目前已經實現了一些損失函式,包括最常見的l2損失函式,對比損失函式,資訊增益損失函式等等。在這裡做乙個筆記,歸納總結caffe中用到的不同的損失函式,以及分析它們各自適合的使用場景。輸...

Caffe中的損失函式解析

導言 在有監督的 機器學習 中,需要有標籤資料,與此同時,也需要有對應的損失函式 loss function 在caffe中,目前已經實現了一些損失函式,包括最常見的l2損失函式,對比損失函式,資訊增益損失函式等等。在這裡做乙個筆記,歸納總結caffe中用到的不同的損失函式,以及分析它們各自適合的使...