[深度学习主流框架解析一] Caffe

[深度学习主流框架解析一] Caffe

1、模型文件协议解析

重点解析caffe.proto模型文件中的内容,整体的模型文件可见下图。

NetParameter结构

模型结构相关特性:

  • 含有训练和测试推理的开关和相关的必要参数
  • 不包含中间blob的shape,所以shape推导都是在运行时进行的
  • 网络层的可训练参数是用BlobProto代表的

2、Caffe内部推理

Net类 Uml解析

特点总结:

  • 对于Caffe而言,caffe::Net是对外的总体接口,也是最重要的接口,不管是训练还是推理
  • cpu还是gpu的切换时非常简单的
  • Caffe最让我惊讶的是反向传播的实现和传递,待继续研究和总结
  • 外部接口采用了模板函数的写法,但是目前只支持float类型

3、Caffe反向传播实现细节

运用到的数学原理是《求导的链式法则》,相关表达式如下所示:

δ y δ z = δ y δ x ∗ δ x δ z \frac{\delta y}{\delta z} = \frac{\delta y}{\delta x} * \frac{\delta x}{\delta z} δzδy=δxδyδzδx

下面以caffe中的sigmoid算子进行说明caffe内部的反向传播过程是如何的。

3.1、sigmoid算子介绍

sigmoid是激活函数,具体的数学公式如下所示:

f ( x ) = 1 ( 1 + e − x ) f(x) = \frac{1}{(1 + e^{-x})} f(x)=(1+ex)1

3.2、sigmoid的偏导

δ f ( x ) δ x = f ( x ) ∗ ( 1 − f ( x ) ) \frac{\delta f(x)}{\delta x} = f(x) * (1 - f(x)) δxδf(x)=f(x)(1f(x))

3.3、具体的caffe反向传播代码解析
template <typename Dtype>
void SigmoidLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
    const vector<bool>& propagate_down,
    const vector<Blob<Dtype>*>& bottom) {
  /*
  top表示网络层的输出blob
  bottom表示网络的输入blob
  propagate_down表示是否反向传播到输入的标识符,一般为true
  */
  if (propagate_down[0]) {
    const Dtype* top_data = top[0]->cpu_data();//上次前向传播的该层的输出值
    const Dtype* top_diff = top[0]->cpu_diff();//该层之后的网络层到该层的输出的反向传播偏导值
    Dtype* bottom_diff = bottom[0]->mutable_cpu_diff();//该层需要计算的反向传播值
    const int count = bottom[0]->count();
    for (int i = 0; i < count; ++i) {
      const Dtype sigmoid_x = top_data[i];//相当于f(x)
      //相当于偏导的链式传播法则的计算(d_loss/d_x = d_loss/d_top * (f(x) * (1 - f(x))))
      bottom_diff[i] = top_diff[i] * sigmoid_x * (1. - sigmoid_x);
    }
  }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值