caffe学习_2.名词理解

关于caffe,在学习怎么使用它之前首先要理解下相关的些概念,官网上讲的非常详细,http://caffe.berkeleyvision.org/tutorial/在此放些“摘要”进来。

一.前后传播

前向传播,从下向上,我大致理解为原始数据层层处理,计算loss函数

后向传播,从上向下,各层计算梯度

二.Blob

Blob是N维数组,是通信和操作信息的caffe框架的统一的标准存储接口。

存储的图像数据格式(一般4D):批处理的n个图像*k个通道*图像的高h(rows)*图像的宽w(cols),即n*k*h*w。(注,Imagenet中batchsize=n=256,RGB图像k=3,灰度图像k=1),(n,k,h,w)对应的物理地址((n * k + k) * h + h) * w + w 。

当然Blob的尺寸根据层得到类型和配置而不尽相同,比如,具有96个11*11的空间维度和三个输入的滤波器的卷积层,它的Blob尺寸就是96*3*11*11。对于内积层或全连接层,1000输出通道+1024输入通道,此时Blob尺寸就是1000*1024。

一个Blob会存储两块内容,一个是数据,一个是计算的梯度。两种方法获取数据:

第一种:const Dtype* cpu_data() const;   #取得常值,gpu同
第二种:Dtype* mutable_cpu_data();  #取得地址?数据值可变,gpu同

指导文件上有这么一句话需要注意的A rule of thumb is, always use the const call if you do not want to change the values, and never store the pointers in your own object. Every time you work on a blob, call the functions to get the pointers, as the SyncedMem will need this to figure out when to copy data.一个经验法则是,如果不想更改数据,那么始终使用取const常值,并且永远不要将指针存贮在自己的对象中,每次处理Blob时都调用函数来获取指针。

最后,指导文件里面给了个数据流动的例子,可以通过这段代码看Blob的数据流动情况:

// Assuming that data are on the CPU initially, and we have a blob.
const Dtype* foo;
Dtype* bar;
foo = blob.gpu_data(); // data copied cpu->gpu.
foo = blob.cpu_data(); // no data copied since both have up-to-date contents.
bar = blob.mutable_gpu_data(); // no data copied.
// ... some operations ...
bar = blob.mutable_gpu_data(); // no data copied when we are still on GPU.
foo = blob.cpu_data(); // data copied gpu->cpu, since the gpu side has modified the data
foo = blob.gpu_data(); // no data copied since both have up-to-date contents
bar = blob.mutable_cpu_data(); // still no data copied.
bar = blob.mutable_gpu_data(); // data copied cpu->gpu.
bar = blob.mutable_cpu_data(); // data copied gpu->cpu.

三.Layer

Layer层是网络框架最基本也是最关键的,有我们听的较多的卷积层、池化层、内积层等等。Layer层是需要重点理解的,不同的层完成不同的任务,需要去知晓这些然后才能运用它们组合成网络框架完成特定的任务需求,总而言之,这个是组成框架的非常重要的一部分。

Layer层可以看作是连接数据的,已知数据输入,待求数据输出:

官方分类有:Data Layers(包含Image Data)、Vision Layers(包含Convolution LayerPooling Layer)、Recurrent Layers(包含Long-Short Term Memory (LSTM)RNNRecurrent)、Common Layers(包含Inner ProductDropout)、Normalization Layers(包含Local Response Normalization (LRN))、Activation / Neuron Layers(包含ReLU / Rectified-Linear and Leaky-ReLUSigmoid)、Utility Layers(包括Softmax)、Loss Layers(包含Softmax with Loss)。

卷积层、池化层和激活函数层相当于“特征工程”,其局部感受野+权值共享的设计思想也能避免全连接网络中的种种弊端,是将原始数据映射到隐层特征空间,卷积层=特征提取,池化层=特征筛选,激活函数层=增加模型的非线性表达能力,特征提取的误差主要来自两个方面:(1)邻域大小受限;(2)卷积层权值参数误差,average -pooling能减小第一种误差,更多的保留图像的背景信max-pooling能减小第二种误差,更多的保留纹理信息。具体的概念--谷歌、百度。

全连接层相当于“分类器”,起到将学到的“分布式特征表示”映射到样本标记空间的作用,本质就是由一个特征空间非线性变换到另一个特征空间。在实际使用中,全连接层可由卷积操作实现:对前层是全连接的全连接层可以转化为卷积核为1x1的卷积;而前层是卷积层的全连接层可以转化为卷积核为hxw的全局卷积,h和w分别为前层卷积结果的高和宽。

关于卷积层、池化层、全连接层等等,理解上可以去查看这篇知乎的问答:https://www.zhihu.com/question/41037974

四.Net

典型的节点(Net)都是从数据层开始到损失层结束,被定义为连接。

有一段初始化节点的,可以看出数据的流动:

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

五.Model format

翻译为,模型形式,可以说是整个框架的骨肉,而Layer层是灵魂。需要重点去了解,这儿是官方给的协议 :https://github.com/BVLC/caffe/blob/master/src/caffe/proto/caffe.proto

还有好些,待补充。

下一篇 finetune https://blog.csdn.net/vahalla233/article/details/82718616

猜你喜欢

转载自blog.csdn.net/vahalla233/article/details/81874995
今日推荐