caffe 数据结构

      caffe由Blob、layer、Net组成。prototxt文件定义caffe的Net,Net由许多layer构成,
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(使其生效)。


      2、编译自己设定的protobuf文件,并测试一个Blob程序,test_pb.cpp:

/*
 *
 * 功能: 测试使用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
       执行可执行程序后,即可得到输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值