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 = 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()<#include 
#include 
#include 
#include 
#include 
#include 
#include 


using namespace caffe;  // NOLINT(build/namespaces)
using std::string;



int main(int argc, char** argv) {


 //从model_file(xxx.prototxt)中初始化网络结构
shared_ptr > net_;
net_.reset(new Net("./net.prototxt", TEST));
//设置网络的权重参数,如使用训练好的网络来初始化网络参数,或自己手动设置网络权重所在的Blob
//由于我们的网络只有一层卷积,一层卷积只有两个网络参数,第一个是W(num_output,num_input,height,width),第二个是b(num_output)
const vector > >& net_params = net_->params();
std::cout<& shape = net_params[0]->shape();#得到第一个网络参数W的Blob
std::cout<mutable_cpu_data();#获取和设置W所在的Blob
for(int i =0;icount();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)<Forward();

Blob* 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的学习)