caffe中Blob和Net最基本的操作

首先,查看相关的结构体的定义

Net: Net类的数据结构 构造函数(从NetPatameter构造或者从net.prototxt中构造),初始化函数,NetParameter; 前向传播,反向传播 Net的读取与保存(序列化) 返回Blobs, Layers的名称,是否需要反向传播,权值和相关参数等 查找当前网络是否包含指定名称的Blob,Layer 初始化Init() 构建所有的Layer:CreateLayer(param.layer(layer_id)); 确定Layer的输入Blob和输出Blob,从而将各个layer通过Bolb连接起来 调用Layer->Setup函数 初始化各层权值Blob 前向传播Forward net->ForwardFromTo调用相应层的layer_[i]->Forward(bottom_vecs_[i],top_vecs_[i])

Blob: Blob用于存储4维数据。4个维度分别为(num,channel,height,width). public: 构造函数 Reshape,打印Bolob的shape,获取某一维度的尺寸,根据n计算偏移量,Blob中的元素数目 获取指定位置的data或diff,获取cpu_data或cpu_diff Blob的序列化或反序列化 protected: 指向data_,diff_的指针 形状信息shape_ 存放有效元素数目的信息count_,Blob的容量信息capacity_. src/caffe.blob.cpp Reshape(),变维函数 构造函数 获得cpu_data,cpu_diff,gpu_data,gpu_diff的指针 共享另一个Blob的data,diff指针 Update来更新网络中的参数(data = https://www.it610.com/article/data-diff) Blob的序列化与反序列化

Blob的基础功能有:定义一个Blob,打印Blob的shape,重定义该Blob的shape(Blob的大小可以不一致),修改和获取Blob在各个位置的参数值
#include #include #include using namespace caffe; using namespace std; int main(void) { Blob a; #定义一个Blob cout<<"Size : "<< a.shape_string()< >& net_params = net_->params(); std::cout<shape(); #得到第一个网络参数W的Blob std::coutcount(); i++) { p[i]=i%2==0?1:1; } for(int u =0; uchannels(); u++) { for(int v =0; vheight(); v++) { for(int w =0; wwidth(); w++) { std::cout<data_at(0,u,v,w)<* input_layer = net_->input_blobs()[0]; //输入Blob可能有多个,[0]表示获取第一个Blob float *p2 = input_layer->mutable_cpu_data(); int num_channels_ = input_layer->channels(); for(int i2 =0; i2count(); i2++) { p2[i2]=(i2%2==0)?2:5; } for(int u =0; uchannels(); u++) { for(int v =0; vheight(); v++) { for(int w =0; wwidth(); w++) { std::cout<<"input_layer"<data_at(0,u,v,w)* out_layer = net_->output_blobs()[0]; float *p4 = out_layer->mutable_cpu_data(); for (int x =0; xnum(); x++) { for(int u =0; uchannels(); u++) { for(int v =0; vheight(); v++) { for(int w =0; wwidth(); w++) { std::cout<<"out_layer"<data_at(x,u,v,w)<

用于创建网络模型的xxx.prototxt
1.数据输入层 不指定数据,指定数据的维度 input: "data" input_dim: 1 input_dim: 1 input_dim: 10 input_dim: 10图像语义分割的输入,需要自己创建DenseImageData层 layer { name: "ImageData1" type: "DenseImageData" top: "ImageData1" top: "ImageData2" dense_image_data_param { source: "/media/mlxuan/LinuxH/project/SegNet/SegNet-Tutorial-master/CamVid/train.txt" batch_size: 1 shuffle: true } }图像分类的输入其他2.卷积层layer { name: "Convolution1" type: "Convolution" bottom: "data" top: "Convolution1" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 1 pad: 0 kernel_size: 3 stride: 1 dilation: 1 weight_filler { type: "msra" } bias_filler { type: "constant" } } }

【caffe中Blob和Net最基本的操作】

    推荐阅读