caffe.NetSpec
NetSpec是包含Tops(可以直接赋值作为属性)的集合。调用NetSpec.to_proto创建包含所有层(layers)的网络参数。
n = caffe.NetSpec()是获取Caffe的一个Net。
利用caffe.proto自定义自己的网络:
其中caffe采用了Protocol Buffers的数据格式,Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或序列化。它适合做数据存储或RPC数据交换格式。可用于通讯协议,数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。(有C++、Java、Python三种语言的API)。
关于:Protobuf :
一、利用例子的描述
1、书写.proto文件
编写proto文件,在protobuf的术语中,结构化数据被称为Message。proto文件:
package lm;
message helloworld
{
required int32 id = 1; //ID
required string str = 2; //str
optional int32 opt = 3; //optional field
}
该例子中,package名字叫做lm,定义了一个消息helloworld,该消息有三个成员,类型为int32的id, 类型为string的str,opt是一个可选的成员,即消息中可以不包含该成员。
2、 编译.proto文件
protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto
该命令将生成:lm.helloworld.pb.h(定义了C++类的头文件)和lm.helloworld.pb.cc(C++类的实现文件)
在生成的头文件中,定义了一个C++类helloworld,后面的writer和Reader将使用这个类来对消息进行操作。
使用protobuf,可以不用考虑消息格式的细节。
写好proto文件后就可以用protobuf编译器将文件编译成目标语言了,
在阅读caffe.proto中:遇到两种前缀: optional、repeated。 optional就是一个数据,repeated是数组。
required: 一个格式良好的消息必须有这一个字段
optional: 一个格式正确的消息可以有零个或一个这个字段(但不能超过一个)
repeated: 该字段可以在格式良好的消息中重复任意次数(包含零),重复值的顺序将被保留。
blobShape: 指定一个blob的形状(尺寸)
blobProto: 是存储数据单元的,实际上就是定义一个超立方体,中间包含了数据和差(用来计算残差反转之类的)。
Datum :包含要转换的数据
参考文章:
https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/index.html