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

2016/9/13 caffe官方文档阅读

简述

深度学习网络是一种组合模型,表示为相互关联的数据处理层的集合。Caffe把网络定义成一个层与层叠加的模式。一个网络模型需要从底层的输入数据到顶层的损失的整个模型。当数据和数据的派生物通过前向和反响通道流经网络时,caffe以Blobs德兴市存储交互和操作信息:Blob是标准的数组和统一的存储接口。Layer是模型和计算的基础构件,Net是Layer的链接和集合,Blob详细描述了信息如何在Layer和Net存储和交互的。

Blob

Blob是caffe实际操作和传递数据的包装类,提供可以同步运行于CPU和GPU的能力。数学概念上,一个blob是一个N维数组存储于c-临近样式。

caffe使用blob存储和传递数据。Blobs提供同意的存储接口来承载数据,如图像批,模型参数,调优参数等。

Blob通过按需将任务从CPU同步到GPU上克服了计算能力的限制。主机和设备的资源被按需分配以高效利用。

一般用于表示批图像数据(batches of image)的blob的维度是数目Nx通道数Kx高度Hx宽度W。Blob是行优先的,所以最后的维度变化最快。例如,一个4维blob,index(n,k,h,w)在物理上存储于index(((n*k+k)*h+h)*w+w)。

数目N是一批图像数据的个数,分批处理图像数据有利于提高通信和计算的能力。例如ImageNet采用的batch每批图像数目N=256。

通道数K是特征的的维度,例如RGB图像就是三通道的。

许多caffe例子中的blob都是4维的用于图像应用,用于非图像应用也是完全可行的。

参数blob的维度会根据层的形式和结构而变化。一个有96个11x11维滤镜以及3个输入的卷积层的blob维数是96x3x11x11.对于一个有1000个输出通道和1024个输入通道的全连接层的参数blob维数是1000x1024。

对于特定的数据,有必要你自己的输入预处理工具或者数据层。当你的数据准备好了,模块化的层结构就会完成你后续的工作。

实现细节:
因为我们在实际问题中关注blob以及blob的导数值,所以blob存储两大块的内容——数据(data)和差异(diff)。data是正常的传输数据,diff是网络计算得到的梯度值。

另外,由于数据实际上存储于CPU和GPU上,所有有两种方法来访问它们,一种是常量方式,一种是修改方式,读写方式可以修改数据值。

const Dtype* cpu_data() const;
Dtype* mutable_cpu_data();

这样设计的原因是blob使用了SyncedMem类来同步CPU和GPU中的数据以隐藏同步细节和最小化数据传输。一个经验规律是尽可能使用const方法并且永远不要在你自己的对象中存储指针。每当你需要blob工作,调用方法去获得指针,SyncedMem类需要它来决定什么时候复制数据。

实际上,当在GPU模式运行caffe,由于每一层都要使用GPU运算,所有的数据都会存储在GPU上。

Layer

Layer是网络模型的必须构件。Layer可以进行卷积(convolve),池化(pool),内积(inner products),非线性变换,正规化(normalize),加载数据(load data),计算损失(loss)。
所有的Layer形式见Layer Catalogue

一个Layer从button连接获得输入,从top连接产生输出。

每一个层要定义一个模式:setup,forward,backward。

Setup:当模型初始化时,初始化层和它的连接
Forward: 从bottom获得输入,计算并向top传递输出
Backward:从top获得输出,计算梯度,并传递到bottom

特别的是,将会有两个Forward和Backward功能运行,一个用于CPU,一个用于GPU。这回使运算更敏捷,虽然损失了一些数据传输的消耗。

Layer在网络中有两个关键的责任:前向通道获取输入,计算产生输出;反向通道根据输出计算梯度,再根据层参数计算获得梯度,传递给输入,反馈给前面的层(BP算法)。

层的定制开发只需要很少的工作量,只需要修改少量网络结构和代码。定义好层模式:setup,forward,backward,就可以加入到网络结构中了。

Net

Net通过组合Layer来实现某种功能。通过处理每个层的输出组合来完成一个任务,并通过每个层的反向计算梯度和损失以进行学习,caffe是首尾相连的机器学习引擎。

Net是一系列层连接起来的计算图谱——directed acyclic graph(DAG)。Caffe记录所有层的DAG来确保前向通道和反向通道的准确性。一个典型的网络以一个数据层开始,数据层从磁盘加载数据,以一个损失层结束,损失曾计算任务的目标诸如分类和重建。

模型初始化是通过Net::Init()完成的,初始化主要做两件事:通过创建Layer和Blob建立起网络的框架;调用Layer的SerUp()方法。他也做一系列其他的记录工作,如验证整个网络结构的正确性。初始化时,会生成运行日志解释初始化的进行。
这里写图片描述

注意到网络的构建是设备无关的,回想上文我们讲到的Blob和Layer隐藏了实现的细节。建模之后,网络在CPU还是GPU上运行只需由Caffe::mode()和Caffe::set_mode()方法进行设置。模式选择与模型定义是独立的。对于研究和开发,这种建模和实现分离的设计是很好的。

Model format
模型是定义在纯文本protocol buffer格式文件(prototxt)中的。学习后的模型被序列化为二进制protocol buffer(binaryproto).caffemodel文件。
Model fomat实在caffe.proto中定义的,这个文件可以充分自解释,建议阅读。

参考文献:http://caffe.berkeleyvision.org/tutorial/net_layer_blob.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值