Caffe学习(五)——Blob,Layer,Net介绍

简介

深度网络(Net)是由许多互相连接的层(layers)组合成的组合模型,Caffe定义的网络模型就是这样逐层(layers)连接。
Net包含了整个自顶向下的网络,网络由各个Layer组合而成;
Layer指处理数据的单层运算算子(比如卷积运算、pooling运算等);
Blob是网络运行时数据存储、传递和操作的接口;

以examples/mnist/lenet_train_test.prototxt为例,将文件内容复制到
http://ethereon.github.io/netscope/#/editor
网站左侧框中,按ctrl+enter便可在右侧清楚查看到网络样子:
Caffe学习(五)——Blob,Layer,Net介绍_第1张图片
(突然无法打开网站了,找了个不匹配的图~)
其中整个LeNet自顶向下就是网络Net,每个框conv1,pool1,conv2等是layer,表示每层的数据运算类型,对应.prototxt的type,比如name是conv1的type是Convolution,表示对数据(Blob)一次卷积运算。Blob是运算数据表示,从网络是看不到的(但是实际运算是会用到,数据存储、传递等)。

Blob

Blob提供了Caffe网络运行时数据接口,同时提供了CPU和GPU之前数据同步功能,可以达到CPU和GPU切换运算(使用者不感知)。
Blob数据存储是使用C实现的N维数组,是caffe数据操作的基本单位。N可以是1或者n,表示1维或者多维数据。对于一般图片数据来说,是4维的,使用(N,C,H,W)表示,N表示图片数量,C表示通道数量,H表示图片高度,W表示图片宽度,所以数据总大小是N*C*H*W*sizeof(数据存储格式)。

layer

层(layer)是网络(Net)组成的基本单位,表示对此层输入数据(上层的输出)的运算,比如Convolution、Pooling、Softmax等运算。一个层的定义大致如下:
Caffe学习(五)——Blob,Layer,Net介绍_第2张图片
conv1层从bottom层获取输入,并输出给top层(这里有点相反,bottom表示上一层,即conv1的输入,top表示下一层)。
每层定义三个关键计算:setup, forward, and backward:
Setup:初始化图层以及整个网络连接的初始化;
Forward:从bottom得到输入数据,进行计算,并将计算结果送到top,进行输出;
Backward:从层的输出端top得到数据,计算反馈,送到bottom,网络训练时根据反馈将其参数自调整;

Net

Net由多个layer组成,是一个有向无环图(DAG)。Caffe运行时记录每层的数据,并且确保前向(Forward)和后向(Backward)的正确性。
例如:
Caffe学习(五)——Blob,Layer,Net介绍_第3张图片
定义.prototxt文件

name: "LogReg"
layer {
  name: "mnist"
  type: "Data"
  top: "data"
  top: "label"
  data_param {
    source: "input_leveldb"
    batch_size: 64
  }
}
layer {
  name: "ip"
  type: "InnerProduct"
  bottom: "data"
  top: "ip"
  inner_product_param {
    num_output: 2
  }
}
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "ip"
  bottom: "label"
  top: "loss"
}

Caffe使用Net::Init()初始化网络,主要包括:1)初始化Blob和Layer来构建整个图,然后调用每层的SetUp()函数;2)执行其他记录操作,例如验证整个网络体系结构的正确性。 此外,在初始化期间,Net通过记录到INFO来解释其初始化:

I0902 22:52:17.931977 2079114000 net.cpp:39] Initializing net from parameters:
name: "LogReg"
[...model prototxt printout...]
# construct the network layer-by-layer
I0902 22:52:17.932152 2079114000 net.cpp:67] Creating Layer mnist
I0902 22:52:17.932165 2079114000 net.cpp:356] mnist -> data
I0902 22:52:17.932188 2079114000 net.cpp:356] mnist -> label
I0902 22:52:17.932200 2079114000 net.cpp:96] Setting up mnist
I0902 22:52:17.935807 2079114000 data_layer.cpp:135] Opening leveldb input_leveldb
I0902 22:52:17.937155 2079114000 data_layer.cpp:195] output data size: 64,1,28,28
I0902 22:52:17.938570 2079114000 net.cpp:103] Top shape: 64 1 28 28 (50176)
I0902 22:52:17.938593 2079114000 net.cpp:103] Top shape: 64 (64)
I0902 22:52:17.938611 2079114000 net.cpp:67] Creating Layer ip
I0902 22:52:17.938617 2079114000 net.cpp:394] ip <- data
I0902 22:52:17.939177 2079114000 net.cpp:356] ip -> ip
I0902 22:52:17.939196 2079114000 net.cpp:96] Setting up ip
I0902 22:52:17.940289 2079114000 net.cpp:103] Top shape: 64 2 (128)
I0902 22:52:17.941270 2079114000 net.cpp:67] Creating Layer loss
I0902 22:52:17.941305 2079114000 net.cpp:394] loss <- ip
I0902 22:52:17.941314 2079114000 net.cpp:394] loss <- label
I0902 22:52:17.941323 2079114000 net.cpp:356] loss -> loss
# set up the loss and configure the backward pass
I0902 22:52:17.941328 2079114000 net.cpp:96] Setting up loss
I0902 22:52:17.941328 2079114000 net.cpp:103] Top shape: (1)
I0902 22:52:17.941329 2079114000 net.cpp:109]     with loss weight 1
I0902 22:52:17.941779 2079114000 net.cpp:170] loss needs backward computation.
I0902 22:52:17.941787 2079114000 net.cpp:170] ip needs backward computation.
I0902 22:52:17.941794 2079114000 net.cpp:172] mnist does not need backward computation.
# determine outputs
I0902 22:52:17.941800 2079114000 net.cpp:208] This network produces output loss
# finish initialization and report memory usage
I0902 22:52:17.941810 2079114000 net.cpp:467] Collecting Learning Rate and Weight Decay.
I0902 22:52:17.941818 2079114000 net.cpp:219] Network initialization done.
I0902 22:52:17.941824 2079114000 net.cpp:220] Memory required for data: 201476

更加详细说明可查看官方说明文档:http://caffe.berkeleyvision.org/tutorial/net_layer_blob.html
Caffe学习(五)——Blob,Layer,Net介绍_第4张图片

你可能感兴趣的:(caffe)