caffe由Blob、layer、Net组成。prototxt文件定义caffe的Net,Net由许多layer构成,
Blob是构成layer的基本概念。
编译链接ly.helloworld.pb.cc和test_pb.cpp源文件,得到可执行文件test_pb:
Blob是构成layer的基本概念。
1、以Blob为例,讲解一个Blob测试程序,test_blob.cpp:
/*
*
* 功能:
* 1. 测试使用Blob
* 2. 给blob赋值
* 3. 获取blob指定位置的值
* 4. 输出通过L1范式和L2范式得到的结果
*
*/
#include <iostream>
#include "caffe/blob.hpp"
int main(int argc,char* argv[]){
//构造一个Blob,函数在include/caffe/blob.hpp中有申明
caffe::Blob<float> b;
std::cout<<"Size : "<<b.shape_string()<<std::endl;
b.Reshape(1,2,3,4); //修改维度大小,即每一维大小
std::cout<<"Size : "<<b.shape_string()<<std::endl;
//使用mutable_cpu_data函数修改Blob内部数值
float* p = b.mutable_cpu_data(); //读写访问cpu_data指针
for(int i=0;i<b.count();i++){
p[i] = i; //给blob对象赋值
}
//打印指定位置的每一个数值
for(int u=0; u<b.num() ;u++){
for(int v=0;v<b.channels();v++){
for(int w=0;w<b.height();w++){
for(int x=0; x<b.width();x++){
std::cout<<"b["<<u<<"] ["<<v<<"] ["<<w<<"] ["<<x<<"] ="<<b.data_at(u,v,w,x)<<std::endl;
}
}
}
}
//求L1,L2范式及其输出结果
std::cout<<"ASUM : "<<b.asum_data()<<std::endl;
std::cout<<"SUMSQ : "<<b.sumsq_data()<<std::endl;
return 0;
}
使用如下命令编译这个程序:g++ -I $caffe_root/include/ -I $caffe_root/build/src/ -o app test_blob.cpp -D CPU_ONLY -L $caffe_root/build/lib/ -lcaffe -lglog
注:g++:编译c++文件,gcc:编译C文件;
运行该文件生成可执行文件app.
运行该程序:
export LD_LIBRARY_PATH=$caffe_root/build/lib/:$LD_LIBRARY_PATH
//从前一个开始找,找不到再找后一个,可共存,互不影响
./app
上述export只是添加临时环境变量,若想添加永久性的环境变量可以按如下方法:1 Sudo gedit /etc/ld.so.conf //打开文件
2 在文件中添加路径(libnnpack.so的路径)
3 Sudo ldconfig(使其生效)。
/*
*
* 功能: 测试使用protocol buffer生成的cpp文件
*
*/
#include <iostream>
#include <fstream>
#include "ly.helloworld.pb.h"
int main(int argc,char* argv[]){
ly::helloworld msg;
msg.set_id(10);
msg.set_str("hello");
std::cout<<msg.id()<<" "<<msg.str()<<std::endl;
// Write the new address book back to disk.
std::fstream output("./log",std::ios::out | std::ios::trunc | std::ios::binary);
if(!msg.SerializeToOstream(&output)){
std::cerr<< "Failed to write msg."<< std::endl;
return 1;
}
return 0;
}
自己设定的protobuf文件ly.helloworld.proto内容如下:
package ly;
message helloworld
{
required int32 id = 1;
required string str = 2;
optional int32 opt = 3;
}
包括,包:ly,类:helloworld,包含2个必须参数id,str,1个可选参数opt。
编译该文件生成ly.helloworld.pb.cc,ly.helloworld.pb.h两个文件,执行语句如下:
protoc -I=. --cpp_out=. ly.helloworld.proto
(-I;制定搜索目录,protoc:protobuf编译命令)编译链接ly.helloworld.pb.cc和test_pb.cpp源文件,得到可执行文件test_pb:
g++ -o test_pb test_pb.cpp ly.helloworld.pb.cc -lprotobuf
//或者gcc -o test_pb test_pb.cpp ly.helloworld.pb.cc -lprotobuf -lstdc++
输入:
./test_pb
执行可执行程序后,即可得到输出。