赞
踩
Blob<float> a;//声明一个Blob对象a
cout<<"Size: "<<a.shape_string()<<endl;//利用shape_string()方法打印其尺寸信息,
如:Size: 1 2 3 4(24)表示num channels height width 和元素总数.
a.Reshape(1,2,3,4,);//设定该对象的大小
float* p = a.mutable_cpu_data();//获得a的data指针
float* q = a.mutable_cpu_diff()//获得a的diff(误差)指针
a.Update();//执行update操作,将diff与data融合,做data = data - diff计算,是权值更新的最终实施者。
a.num(),a.channels(),a.height(),a.width(),分别表示对象a中不同维度中的元素数量
a.data_at(n,c,h,w);//表示取a中位置为(n,c,h,w)处的数据
a.asum_data()用于计算并返回绝对值之和(L1范数)
a.sunsq_data()用于计算并返回平方和(L2范数)
Blob的强大之处在于可以同步CPU/GPU上的数据。
Blob的内部值保存到磁盘
#include<caffe/util/io.hpp>//需要包含头文件
BlobProto bp;//构造一个BlobProto对象
a.ToProto(&bp,true);//将a序列化,连同diff(默认不带)
WriteProtoToBinaryFile(bp,"a.blob");//写入磁盘文件“a.blob”
BlobProto bp2;
ReadProtoFromBinaryFileOrDie("a.blob",&bp2);//从序列化文件中读取磁盘文件
Blob<float> b;//建立一个Blob对象
b.FromProto(bp2,true);//从序列化对象中克隆b(连同形状)
//然后就可以使用循环将b的内容打印出来
from(int n = 0;n<b.num();n++)
from(int c = 0;c < b.channels();c++)
from(int h=0; h<b.height();h++)
from(int w = 0;w < b.width();w++)
cout<<"b["<<n<<"]["<<c<<"]["<<h<<"]["<<w<<""]<<b.data_at(n,c,h,w);
由此可见,BlobProto对象实现了磁盘、内存之间的数据通信。这对于保存、载入训练好的模型权值非常使用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。