Caffe解读(一)

Caffe 基本架构

理解caffe的架构,包括blob,layer,net,solver,tools的关系等

源码文件结构

  • tools
    • 保存的源码是用于生成二进制处理程序的,caffe在训练时实际是直接调用这些二进制文件
  • include
    • Caffe的实现代码的头文件
  • src
    • 实现Caffe的源文件
    • gtest: google test一个用于测试的库你make runtest时看见的很多绿色RUN OK就是它,这个与caffe的学习无关,不过是个有用的库
    • caffe: 关键代码:
      • ./test:用gtest测试caffe的代码
      • ./util:数据转换时用的代码
        +注:caffe速度快很大程度得益于内存设计上的优化(blob数据结构采用proto)以及对卷积的优化(部分与im2col相关)
      • ./proto:全称“Google Protocol Buffer”,是一种数据存储格式,帮助caffe提速
      • ./layers:深度神经网络中包含的各层网络相关代码
      • ./solvers:各种优化方法的相关代码
      • blob.cpp:基本的数据结构Blob类
      • common.cpp:Caffe类
      • data_transformer.cpp:输入数据的基本操作类DataTransformer
      • internal_thread.cpp:使用boost::thread线程库
      • layer_factory.cpp:网络层Layer类
      • net.cpp:网络结构Net类
      • parallel.cpp:多机数据并行
      • solver.cpp:优化方法Solver类
      • syncedmem.cpp:分配内存和释放内存类CaffeMallocHost,用于同步GPU,CPU数据

Caffe官方说明的三级结构

http://caffe.berkeleyvision.org/tutorial/net_layer_blob.html
blob:数据操作、存储、交换;
layer:网络模型集成和计算;
net:整合和连接layer

Blob
  • Blob是Caffe的基本数据结构,具有CPU和GPU之间同步的能力。Caffe的数据存储和数据交流都是通过blobs,并且提供了一个统一的数据存储的接口。只要是caffe网络中传递的数据都可以用blob存储:图片、参数、梯度…
  • Blob数据维度:4维的数组(number N×channels K×height H×width W)
  • Blob数据存储:row-major:(n,k,h,w)的存储物理位置为((n×K+k)×H+h)×W+w
  • Blob同时保存了data和diff,访问data或diff的两种方法:
    1 const Dtype cpu_data() const; //不修改值
    2 Dtype mutable_cpu_data(); //修改值
  • 实例:
    • 一个“层”,可以理解为执行相应操作后,得到的结果。比如,执行卷积操作,得到卷积层;执行全连接操作,得到全连接层。对于一个卷积层,其处理的“输入”是多个feature maps,也就是一个Blob实例:(N1,C1,H1,W1),比如(5,3,224,224),表示5张图像(这里的5,可以认为是一个minibatch的batch size,即图片数量)
    • 卷积操作需要卷积核的参与,卷积核也是Blob的实例:(N2,C2,H2,W2),比如(96,3,7,7),表示有96个卷积核,每个卷积核是一个3维的结构,是7x7的截面、3个通道的卷积核
    • 卷积层的输出也是若干feature maps,也是一个Blob实例:(N3,C3,H3,W3),是根据输入的feature maps和指定的卷积核计算出来的。按上面的例子,得到feature map的Blob描述为(5,96,218,218),表示有5个feature maps,每个feature map是96x218x218大小(通常可以这样理解:卷积核的个数,作为结果feature maps中的通道数量)
Layer
  • 模型的基础、计算的单元:所有的Pooling,Convolusion,apply nonlinearities, load data,compute losses等操作都在这里实现
  • layer中input data用bottom表示,output data用top表示。每一层定义了三种操作setup(Layer初始化), forward(正向传导,根据input计算output), backward(反向传导计算,根据output计算input的梯度)。forward和backward分别有GPU和CPU两个版本的实现
Net
  • Net由一系列的Layer组成,Layer之间的连接由一个文本文件描述。
  • Net中既包括Blob对象又包括Layer对象:Blob存储每个Layer输入和输出中间结果,Layer根据Net描述对指定的输入Blob进行计算处理
  • 模型初始化Net::Init()会创建blobs和layers搭建整个网络,并调用Layer::SetUp。在此过程中Net会报告初始化进程。在初始化之后通过Caffe::set_mode()设置Caffe::mode()来选择运行平台CPU或GPU
其他
  • –>solver.prototxt文件被Caffe读取后,最终会被Caffe解析成一个叫SolverParameter的数据对象
    –>solver.prototxt中定义的net文件train.prototxt也会被Caffe解析成一个叫NetParameter的数据对象
    –>NetParameter中layer的类型LayerParameter,layer被解析成一个LayerParameter的数据对象。以上在caffe.proto中找到Solver/Net/LayerParameter,就可以知道Solver/Net/LayerParameter的所有字段及含义描述

参考

http://www.cnblogs.com/zjutzz/p/5960289.html
http://yufeigan.github.io/
http://blog.csdn.net/savant_ning/article/details/53013627

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值