关闭

Caffe框架的理解(一):从blob到layer到net

标签: caffe深度学习blobs
1008人阅读 评论(0) 收藏 举报
分类:

本文转载自caffe学习心得(一)Blobs,Layers,Nets: caffe模型解剖 ——beyond

引言

深度神经网络是一种聚合模型,可以自然的表示为作用于数据块上的内部相连的网络. Caffe用自己的建模方法将网络一层一层定义出来。网络由输入数据到损失层把整个模型自底向上的定义出来。数据和偏导数在网络中前向、后向流动。Caffe使用blob存储、交换、操纵这些信息。blob是整个框架的标准的数组结构和统一存储接口。layer作为建模和计算的基础,net作为layer的集合和链接。blob的细节描述了信息是怎样在layers和nets间存储和交换的.

Blob 存储和通信

Blob 是Caffe处理和传输的真实数据的包装类,同时它还隐含提供了在CPU和GPU之间同步数据的能力。在数学上,一个blob就是一个N维的数组,它是按照c语言风格存储的。(其实就是行优先还是列优先的风格,参照wiki:row-major order).
caffe使用blob存储和交换数据。blob对不同数据提供了统一的内存接口;例如:一批图片,模型参数(weights),优化过程的偏导数等。
Blob通过在需要时将数据从CPU同步到GPU来隐藏在GPU/CPU之间进行混合操作的计算开销和精力开销.host 和device上的内存都是惰性分配的,从而能够高效使用存储空间。
传统的图片数据维数为图片数量N x 通道数K x 高度H x 宽度W。由于Blob的内存布局是行优先,所以最右边/后边的维度变化的最快。例如,在一个4D的blob里,下标(n,k,h,w)在物理内存中位于下标((n*K+k)*H+h)*W+w).

  • Number / N 是数据的 batch
    size.批处理能获得更大的在GPU设备上的吞吐量。例如,对于ImageNet数据训练一批256个图片,N=256.

  • 通道数 / K 是 feature dimension, 例如RGB图片就是3通道的 K = 3.灰度 K=1

注意,尽管Caffe样例中的大多数blob都是4D的带坐标的图片应用,在非图片应用使用Blob也是完全可以的。例如,你仅仅需要一个全连接网络(比如传统多层感知机),使用一个2D的blob(shape(N,D)),调用InnerProductLayer就可以了。
参数blob的维度随着layer的配置和类型变化。例如,对一个有96个filters,每个filter有11X11的空域维度和3个输入的卷积层,它的blob维数为: 96 x 3 x 11 x 11.
对于一个有着1000个输出和1024个输入的内积 / 全连接layer,它的参数blob是1000 x 1024。
对于定制的数据,可能需要自己手工编写输入数据预处理工具或者数据层。但是一旦你的数据准备好了,剩下的工作就交给Caffe了。
由于我们经常对blob的值和梯度感兴趣,所以blob存储了2块data和diff.前者是正常的传输数据,后者是网络计算的梯度。

注:此处可参看博文Blobs数据结构的Python表示 了解如何通过Python语言查看caffe模型中存储值(data)和梯度(diff)以及对应层的权重(weights)和偏置(bias)的。

层的连接和计算

layer是一个模型的精华所在,它也是计算的基本单元。layer包括了filter过滤,pool池化,进行inner product计算,应用诸如rectified-linear和sigmoid等元素级的非线性变换,正则化,读取数据,计算诸如softmax或hinge等代价损失。

每个layer都定义了3个关键的计算操作:setup,forward和backward.

Setup: 在模型初始化的时候初始化layer和它的connections
Forward: 从底层给出输入并计算输出,然后发送给顶层
Backward: 给出顶层输出的梯度,计算输入的梯度,然后发送给底层。一个有参数的层会计算关于参数的梯度然后在内部存储这些梯度。

更详细的说,caffe将会实现2个Forward和Backward函数,一个给CPU,另一个给GPU.如果你没有实现GPU版本,那么layer就会退化成CPU函数作为一个后备选项。
如果你要做快速实验,这个会用起来很顺手,尽管它会造成附加的数据传输开销(它的输入会从GPU复制到CPU,并且它的输出会从CPU拷贝到GPU);

layer在把网络当做整体进行操作的时候有两个关键责任:前向传播从输入计算输出,反向传播获取输出的梯度,然后根据参数向前计算输入的梯度,这些梯度再依次向前传播。这些过程都是简单的前向传播和后向传播的组合。

开发自己定义的层需要一点很小的努力,需要学习网络的组织和代码的模块画。定义每层的setup,forward,backward,然后你定义的这个层就可以包含进一个网络了。

网络定义和操作

net通过组合和自动求导联合定义了一个函数和它的导数.把每一层output组合起来计算一个特定任务的函数,把每一层的backward组合起来从loss计算梯度来学习该任务。Caffe模型是端对端的机器学习引擎。(这个和Theano类似的)

net可以看做一个由layers组成的计算图(computation graph),确切的说是一个有向无环图。Caffe为所有层做了所有bookkeeping的工作来保证前向传播和后向传播的正确性。典型的net由一个从磁盘读取数据的数据层开始,以一个loss层结束,是计算诸如分类或者重构之类的目标任务的。

0
0
查看评论

(Caffe)基本类Blob,Layer,Net(一)

本文地址:http://blog.csdn.net/mounty_fsc/article/details/51037006 Caffe中,Blob,Layer,Net,Solver是最为核心的类,以下介绍这几个类,Solver将在下一节介绍。1 Blob1.1 简介Blob是: 对待处理数据带一层封...
  • mounty_fsc
  • mounty_fsc
  • 2016-04-07 14:26
  • 10758

RPN 解析

RPN全称是Region Proposal Network,Region Proposal的中文意思是“区域选取”,也就是“提取候选框”的意思,所以RPN就是用来提取候选框的网络; 1. RPN的意义 RPN第一次出现在世人眼中是在Faster RCNN这个结构中,专门用来提取候选框...
  • lanran2
  • lanran2
  • 2017-01-12 11:10
  • 17238

Caffe中新建Layer--改写Faster-RCNN的proposal layer

目录 目录 第一步在caffeproto中添加LayerParameter相关参数 第二步实现layer的cpphpp文件 第三步测试 原文链接 在caffe中新建layer主要遵从一下几步: 在caffe.proto中添加LayerParameter相关参数 编写实现layer函数,包括hpp、...
  • u011956147
  • u011956147
  • 2017-03-07 13:46
  • 3365

使用caffe训练的深度学习做目标检测(车辆检测)

#include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include ...
  • u013289254
  • u013289254
  • 2017-04-22 15:09
  • 2983

[caffe笔记005]:通过代码理解faster-RCNN中的RPN

注意:整个RPN完全是笔者自己的理解,可能会有一些理解错误的地方。1. RPN简介RPN是regional proposal networks的缩写,是faster-RCNN结构中的一部分。faster-RCNN由两个子网络构成。第一个子网络RPN的作用是在给定图像上提取一定数量带有objectne...
  • happyflyy
  • happyflyy
  • 2017-02-07 22:38
  • 11554

[caffe]深度学习之CNN检测object detection方法摘要介绍

深度学习之CNN检测object detection领域算法发展的非常迅速;有overfeat, rcnn, spp, fast rcnn, faster rcnn等
  • sunbaigui
  • sunbaigui
  • 2015-08-17 17:44
  • 12116

Caffe入门(3)——Blob,Layer,and Nets:anatomy of a Caffe model

简述深度学习网络是一种组合模型,表示为相互关联的数据处理层的集合。Caffe把网络定义成一个层与层叠加的模式。一个网络模型需要从底层的输入数据到顶层的损失的整个模型。当数据和数据的派生物通过前向和反响通道流经网络时,caffe以Blobs德兴市存储交互和操作信息:Blob是标准的数组和统一的存储接口...
  • picway
  • picway
  • 2016-09-13 22:09
  • 430

梳理caffe代码blob(三)

贯穿整个caffe的就是数据blob: #ifndef CAFFE_BLOB_HPP_ #define CAFFE_BLOB_HPP_ #include #include #include #include "caffe/common.hpp" #include &qu...
  • langb2014
  • langb2014
  • 2016-03-26 15:49
  • 13480

caffe基础(5):Blob,Layer和Net以及对应配置文件的编写

深度网络(net)是一个组合模型,它由许多相互连接的层(layers)组合而成。Caffe就是组建深度网络的这样一种工具,它按照一定的策略,一层一层的搭建出自己的模型。它将所有的信息数据定义为blobs,从而进行便利的操作和通讯。Blob是caffe框架中一种标准的数组,一种统一的内存接口,它详细描...
  • sinat_30071459
  • sinat_30071459
  • 2016-06-21 09:53
  • 863

(Caffe)基本类Blob,Layer,Net(一)

Donatello的吐槽:我为什么要转这篇文章?是因为我在caffe的官网教程上看到提到了vision_layers.hpp,但是我自己找不到,去翻了很多帖子,找了很多github的仓库,怀疑是版本更新后废除了该文件,终于在这篇文章下面找到了确切的说法…… 原文地址:http://blog.csd...
  • DonatelloBZero
  • DonatelloBZero
  • 2016-05-08 15:06
  • 469
    个人资料
    • 访问:145691次
    • 积分:1800
    • 等级:
    • 排名:千里之外
    • 原创:43篇
    • 转载:5篇
    • 译文:0篇
    • 评论:65条
    文章分类
    最新评论