Caffe C 使用教程

2021-07-10 11:48:14 字數 3758 閱讀 1545

by shicai yang(@星空下的巫師)on 2015/08/06

#include "caffe/caffe.hpp"

#include #include using namespace caffe;

char *proto = "h:\\models\\caffe\\deploy.prototxt"; /* 載入caffenet的配置 */

phase phase = test; /* or train */

caffe::set_mode(caffe::cpu);

// caffe::set_mode(caffe::gpu);

// caffe::setdevice(0);

//! note: 後文所有提到的net,都是這個net

boost::shared_ptr< net> net(new caffe::net(proto, phase));

char *model = "h:\\models\\caffe\\bvlc_reference_caffenet.caffemodel";    

net->copytrainedlayersfrom(model);

char *model = "h:\\models\\caffe\\bvlc_reference_caffenet.caffemodel";

netparameter param;

readnetparamsfrombinaryfileordie(model, ¶m);

int num_layers = param.layer_size();

for (int i = 0; i < num_layers; ++i)

}

char *mean_file = "h:\\models\\caffe\\imagenet_mean.binaryproto";

blobimage_mean;

blobproto blob_proto;

const float *mean_ptr;

unsigned int num_pixel;

bool succeed = readprotofrombinaryfile(mean_file, &blob_proto);

if (succeed)

//! note: data_ptr指向已經處理好(去均值的,符合網路輸入影象的長寬和batch size)的資料

void caffe_forward(boost::shared_ptr< net> & net, float *data_ptr)

net->forwardprefilled();

}

//! note: net的blob是指,每個層的輸出資料,即feature maps

// char *query_blob_name = "conv1";

unsigned int get_blob_index(boost::shared_ptr< net> & net, char *query_blob_name)

}log(fatal) << "unknown blob name: " << str_query;

}

//! note: 根據caffenet的deploy.prototxt檔案,該net共有15個blob,從data一直到prob    

char *query_blob_name = "conv1"; /* data, conv1, pool1, norm1, fc6, prob, etc */

unsigned int blob_id = get_blob_index(net, query_blob_name);

boost::shared_ptr> blob = net->blobs()[blob_id];

unsigned int num_data = blob->count(); /* nchw=10x96x55x55 */

const float *blob_ptr = (const float *) blob->cpu_data();

詳見get_features.cpp檔案:

主要包括三個步驟

//! note: layer包括神經網路所有層,比如,caffenet共有23層

// char *query_layer_name = "conv1";

unsigned int get_layer_index(boost::shared_ptr< net> & net, char *query_layer_name)

}log(fatal) << "unknown layer name: " << str_query;

}

//! note: 不同於net的blob是feature maps,layer的blob是指conv和fc等層的weight和bias

char *query_layer_name = "conv1";

const float *weight_ptr, *bias_ptr;

unsigned int layer_id = get_layer_index(net, query_layer_name);

boost::shared_ptr> layer = net->layers()[layer_id];

std::vector>> blobs = layer->blobs();

if (blobs.size() > 0)

//! note: 訓練模式下,讀取指定layer的梯度資料,與此相似,唯一的區別是將cpu_data改為cpu_diff

const float* data_ptr;          /* 指向待寫入資料的指標, 源資料指標*/

float* weight_ptr = null; /* 指向網路中某層權重的指標,目標資料指標*/

unsigned int data_size; /* 待寫入的資料量 */

char *layer_name = "conv1"; /* 需要修改的layer名字 */

unsigned int layer_id = get_layer_index(net, query_layer_name);

boost::shared_ptr> blob = net->layers()[layer_id]->blobs()[0];

check(data_size == blob->count());

switch (caffe::mode())

caffe_copy(blob->count(), data_ptr, weight_ptr);

//! note: 訓練模式下,手動修改指定layer的梯度資料,與此相似

// mutable_cpu_data改為mutable_cpu_diff,mutable_gpu_data改為mutable_gpu_diff

char* weights_file = "bvlc_reference_caffenet_new.caffemodel";

netparameter net_param;

net->toproto(&net_param, false);

writeprototobinaryfile(net_param, weights_file);

SVN使用使用教程

本人在公司孤兒式開發,是用不到svn這種工具的,但是怕突然某一天電腦壞掉,消失所以還是使用上 管理工具。簡單概括一下svn它是 幹什麼的 一群人寫 每乙個人寫的部分都不一樣,但是專案是乙個整體,每個人的 需要合到一起才是乙個完整的專案,但是每乙個人寫的 又不可能出現在其他人的電腦上,所以使用svn專...

Git使用教程

提起git,大家無疑會想到github,沒錯,我就是通過眾多的github專案鏈結了解到的git,不知你是否也在走這條路呢?如果是的話,本文有一些有用的總結性文字以及一些 git教程 可以教會你如何去使用 git.當然,這些對 github 同樣適用.這裡我又翻到了個幻燈片,可以供大家 寫給大家的 ...

mii tool使用教程

mii tool 這是專門設定網絡卡工作模式的命令 1.檢視網絡卡的工作模式,輸入命令 mii tool v eth0 negotiated 100basetx fd,link ok product info vendor 00 05 be,model 8 rev 0 basic status au...