caffe概览

Caffe是一个高效的深度学习框架,以其速度和在学术界的广泛使用而著称。其核心包括Blob数据结构、Layer网络层和Net网络整合。Blob用于存储参数和数据,Layer作为网络的基本单元,Net负责构建和连接层。尽管Caffe有速度快的优点,但也存在版本兼容问题,并不适用于所有研究方向。Solver负责网络的求解,不同优化算法通过重载ComputeUpdateValue()实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考

1、caffe简单介绍

优点:

  • 速度快。Google Protocol Buffer数据标准为caffe提升了效率。
  • 学术论文采用此模型比较多。

缺点:

  • 曾更新过重要函数接口。可能会造成版本兼容问题。
  • 对某些研究方向的人并不合适

caffe的代码层次:数据的保存、交换以及操作基本都是以blob的形式进行的,layer是模型和计算的基础,net整合并连接layer。

  • Blob:是基础的数据结构,用来保存学习到的参数以及网络传输过程中产生数据的类
  • Layer:是网络的基本单元,由此派生出各种类。修改这部分的人主要是研究出特征表达的。
  • Net:是网络的搭建,将Layer所派生出层类组合成网络。Solver:是Net的求解,修改这部分人主要会是研究DL求解方向。

2、详解

  •  
  •  
  • Blob->格式为数组(Num, Channels, Height, Width):使用Blob的容器是因为某些Layer包含多组学习参数,比如多个卷积核的卷积层,以及Layer所传递的数据形式,后面会涉及到:
vector<Blob<Dtype>*> &bottom;
vector<Blob<Dtype>*> *top
  •  
  •  
  • 五大Layer派生类型:caffe十分强调网络的层次性,也就是说卷积操作,非线性变换(ReLU等),Pooling,权值连接等,全部都由某一种Layer来表示。
    • NeuronLayer类:定义于neuron_layers.hpp中,其派生类主要是元素级别的运算(比如Dropout运算,激活函数运算,Sigmoid运算),运算均为同址计算(in-place computation,返回值覆盖原值而占用新的内存)。
    • LossLayer类:定义于loss_layers.hpp中,其派生类会产生loss,只有这些层能够产生loss。
    • data_layer:定义于data_layer.hpp中,作为网络的最底层,主要是实现数据格式的转换。
    • vision_layer:定义于vision_layers.hpp,包含卷积操作,pooling操作。
    • common_layer:定义于common_layers.hpp,caffe提供了单个层和多个层的连接,并且在这个头文件中声明。这里还包括了全连接层InnerProductLayer类。
  • Layer的重要成员函数:在Layer内部,数据主要有两种传递方式,分别是正向传导(Forward)和反向传导(Backward)。Forward和Backward有GPU和CPU两种实现。Caffe中的所有Layer都要用这两种方法传递数据。Layer类派生出来的层类都需要通过实现这两个虚函数,产生各式各样功能的层类。Forward是从根据bottom计算top的过程,Backward则相反(根据top计算bottom)。注意这里为什么用了一个包含Blob的容器(vector),对于大多数Layer来说,输入和输出都各连接只有一个Layer,然而对于某些Layer存在一对多的情况,比如LossLayer和某些连接层。在网络结构定义文件(.proto)中每一层的参数bottom和top参数就决定了vector中元素数目。
virtual void Forward(const vector<Blob<Dtype>*> &bottom, vector<Blob<Dtype>*> *top)=0;

virtual void Backward(const vector<Blob<Dtype*>*> &top, const vector<bool> &propagate_down, vector<Blob<Dtype>*> *bottom)=0;
  • Layer的重要成员变量:
    • loss:vector<Dtype> loss_【每一层都有一个loss_值,但是只有LossLayer才可能产生非0的loss_。计算loss是会把所有层的loss_相加。】
    • learnable parameters:vector<shared_ptr<Blob<Dtype>>> blobs_【前面提到的,Layer学习到的参数】  
  •  
  •  
  • Net:Net是用容器的形式将多个Layer有序的放在一起,其自身实现的功能主要是对逐层Layer进行初始化,以及提供Update()的接口(更新网络参数),本身不能对参数进行有效的学习过程。Net也有自己的Forward()和Backward(),他们是对整个网络的前向和后向传到,各调用一次就可以计算出网络的loss了。
  •  
  •  
  • Solver:这个类中包含一个Net的指针,主要是实现了训练模型参数所采用的优化算法,它所派生的类就可以对整个网络进行训练了。
    • 不同的模型训练方法就是通过重载函数ComputeUpdateValue()实现计算update参数的核心功能。
    • 最后当进行整个网络进行训练时,实际上是在运行caffe.cpp中的train()函数,而这个函数实际上是实例化一个Solver对象,初始化后调用Solve中的Solve方法。而这个Solve()函数主要是在迭代运行下面的两个函数:ComputeUpdateValue()和net_->Update()【分别计算更新的量和更新的过程】。

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值