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中用到的不同的損失函式,以及分析它們各自適合的使...