簡介:
caffe的tools目錄下提供了乙個caffe.cpp,經過編譯工具的編譯會生成乙個命令列工具caffe。該工具提供的功能有: train, test, device_query, time。
訓練的方法:
這裡先分析train的功能,也就是訓練。訓練既支援從零開始訓練,也支援在已有的模型基礎上進行finetune。
finetune的命令列格式:caffe train --solver=solver.prototxt --model=model.ptototxt --weights=weights.caffemodel
其中通過--solver設定solver的prototxt檔案
通過--model設定網路的prototxt檔案
通過--weights設定乙個訓練好的網路,訓練時會用該網路的引數對待訓練的網路的引數進行初始化
int train()
else
} vectorgpus;
get_gpus(&gpus);
if (gpus.size() == 0) else
log(info) << "using gpus " << s.str();
#ifndef cpu_only
cudadeviceprop device_prop;
for (int i = 0; i < gpus.size(); ++i)
#endif
solver_param.set_device_id(gpus[0]);
caffe::setdevice(gpus[0]);
caffe::set_mode(caffe::gpu);
caffe::set_solver_count(gpus.size());
} caffe::signalhandler signal_handler(
getrequestedaction(flags_sigint_effect),
getrequestedaction(flags_sighup_effect));
// 用讀取的solverparameter建立solver
shared_ptr>
solver(caffe::solverregistry::createsolver(solver_param));
solver->setactionfunction(signal_handler.getactionfunction());
// 利用snapshot restore網路或利用weights初始化網路的引數
if (flags_snapshot.size()) else if (flags_weights.size())
// 進行訓練
if (gpus.size() > 1) else
log(info) << "optimization done.";
return 0;
}
caffe中的normalization實現
首先得感謝某牛的 如何在caffe中增加layer以及caffe中triplet loss layer的實現 所以接下來就按照這個牛的介紹,逐個往裡面新增東西就好了。構造設定函式這裡就先忽略,直接進入前饋和反饋的實現。前饋的過程相對來說是比較簡單的,如下 template void normaliz...
caffe中的卷積
如上,將三維的操作轉換到二維上面去做,然後呼叫gemm庫進行矩陣間的運算得到最後結果。兩個矩陣相乘,需要中間的那個維度相同,這個相同的維度就是c k k,其中c是feature map的維度,k為卷積核的邊長。按照卷積核在feature map上面滑窗的順序將其展開成二維的。在三維上面看,就是卷積核...
Caffe之網路輸出
1 fc層 例如caffenet的fc8層 plain view plain copy layer param inner product param bias filler 最後乙個全連線層 神經元個數 類別數,輸出值位於區間 並不是概率值,輸出數值最大的值的index就是樣本的 類別 2 acc...