caffe中的网络结构是一层连着一层的,在相邻的两层中,可以认为前一层的输出就是后一层的输入,可以等效成如下的模型

可以认为输出top中的每个元素都是输出bottom中所有元素的函数。如果两个神经元之间没有连接,可以认为相应的权重为0。其实上图的模型只适用于全连接层,其他的如卷积层、池化层,xy之间很多是没有连接的,可以认为很多权重都是0,而池化层中有可能部分xy之间是相等的,可以认为权重是1。

下面用以上的模型来说明反向传播的过程。在下图中,我用虚线将y与损失Loss之间连接了起来,表示Loss必然是由某种函数关系由y映射而成,我们只需要知道这个函数是由后面的网络参数决定的,与这一层的网络参数无关就行了。

当我们知道了Loss对本层输出的导数dy,便能推出Loss对本层输入x及本层网络参数w的导数。

先推Loss对输入x的导数。由

可知,yx的导数如下,其中g为某种函数映射,它由上面的f唯一地确定,因而是一种已知的映射。

由此推出Loss对x的导数如下,其中h也为某种函数映射,也是由上面的f唯一地确定,是一种已知的映射。

至于Loss对该层网络参数w的导数,由上述公式很容易得到

其中的p、q和g、h一样,都是由f确定的已知映射。

从上面的分析中可以看出,只要知道了Loss对本层输出的导数dy,就能计算出本层参数的梯度,并且求出Loss对本层输入x的导数dx。反向传播是从最后一层(损失层)向第一层(输出层)传播,损失层中Loss对输出的导数dy是能直接求取的,并且本层的输入恰是上一层的输出,因此这种计算可以由后向前地递推下去,这就是反向传播的大体过程。最后示意图如下图所示

以上便是caffe实现反向传播的整体思路。对不同的层,由于前向传播的过程f不一样,所以对应的反向传播的过程p、q也是不一样的。在后面的章节中,我将结合源代码,分析ConvolutionLayer、PoolingLayer、InnerProductLayer、ReLULayer、SoftmaxLayer、SoftmaxWithLossLayer这几种层前向传播、后向传播的具体过程。






caffe中的前向传播和反向传播的更多相关文章

  1. CNN中卷积层 池化层反向传播

    参考:https://blog.csdn.net/kyang624823/article/details/78633897 卷积层 池化层反向传播: 1,CNN的前向传播 a)对于卷积层,卷积核与输入 ...

  2. 机器学习(ML)八之正向传播、反向传播和计算图,及数值稳定性和模型初始化

    正向传播 正向传播的计算图 通常绘制计算图来可视化运算符和变量在计算中的依赖关系.下图绘制了本节中样例模型正向传播的计算图,其中左下角是输入,右上角是输出.可以看到,图中箭头方向大多是向右和向上,其中 ...

  3. 小白学习之pytorch框架(6)-模型选择(K折交叉验证)、欠拟合、过拟合(权重衰减法(=L2范数正则化)、丢弃法)、正向传播、反向传播

    下面要说的基本都是<动手学深度学习>这本花书上的内容,图也采用的书上的 首先说的是训练误差(模型在训练数据集上表现出的误差)和泛化误差(模型在任意一个测试数据集样本上表现出的误差的期望) ...

  4. caffe中 softmax 函数的前向传播和反向传播

    1.前向传播: template <typename Dtype> void SoftmaxLayer<Dtype>::Forward_cpu(const vector< ...

  5. BP原理 - 前向计算与反向传播实例

    Outline 前向计算 反向传播 很多事情不是需要聪明一点,而是需要耐心一点,踏下心来认真看真的很简单的. 假设有这样一个网络层: 第一层是输入层,包含两个神经元i1 i2和截距b1: 第二层是隐含 ...

  6. 反向传播算法(前向传播、反向传播、链式求导、引入delta)

    参考链接: 一文搞懂反向传播算法

  7. 前向传播和反向传播实战(Tensor)

    前面在mnist中使用了三个非线性层来增加模型复杂度,并通过最小化损失函数来更新参数,下面实用最底层的方式即张量进行前向传播(暂不采用层的概念). 主要注意点如下: · 进行梯度运算时,tensorf ...

  8. Tensorflow笔记——神经网络图像识别(一)前反向传播,神经网络八股

      第一讲:人工智能概述       第三讲:Tensorflow框架         前向传播: 反向传播: 总的代码: #coding:utf-8 #1.导入模块,生成模拟数据集 import t ...

  9. caffe中python接口的使用

    下面是基于我自己的接口,我是用来分类一维数据的,可能不具通用性: (前提,你已经编译了caffe的python的接口) 添加 caffe塻块的搜索路径,当我们import caffe时,可以找到. 对 ...

随机推荐

  1. 洛谷P2593 [ ZJOI 2006 ] 超级麻将 —— DP

    题目:https://www.luogu.org/problemnew/show/P2593 DP的话,考虑到当前这一位只跟前两位有关,所以记录一下这3位的状态就行: 于是一开始记录的第 i 位,i- ...

  2. iOS社会化分享(干货)

    一.苹果原生集成的社会化分享 1.哪些平台 (1)Twitter (2)FaceBook (3)Flickr (4)Vimeo (5)新浪微博  :iOS6 (6)腾讯微博 : iOS7 2.框架 : ...

  3. (Go)07.Go语言中strings和strconv包示例代码详解02

    1.strings使用 统计字符串出现次数 strings.Count(s string, substr string) int Count 用于计算字符串 substr 在字符串 s 中出现的非重叠 ...

  4. html5 历史管理

    1.onhashchange:改变hash值来进行历史管理. <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  5. 【java基础】(3)Java继承内存分配

    继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法. (3)子类中定义的成员变量和父类中定义 ...

  6. VC常用代码之创建进程

    作者:朱金灿 来源:http://blog.csdn.net/clever101 创建进程是编程开发的常用操作.Windows中的创建进程采用API函数CreateProcess实现.下面是一个使用例 ...

  7. Java数据的基本类型

    整数类型: byte:8位(1个字节) eg:byte x=2,y: 错误实例:byte b:b=b+3:   其中b=b+3是错误的,应该是b=(byte)(b+3)强制转换: short:16位( ...

  8. CDC之Synchronizers

    1 Scenarios Two scenarios for passing signals across CDC boundaries: 1) sometimes it's not necessary ...

  9. 安卓使用ImageView显示OpenCV-Mat

    Android 的Application-native调试暂时还只能进行主线程调试,在GDB里面,运行于子线程的OpenCv数据处理过程不能直接调试,OPenCV-Native函数    public ...

  10. 闲着无聊时写的一个调用天气 API 的小 Demo

    分为两个部分--调用以及实现,并且由于不想折腾,直接使用了 Console 来调用. 通过firefox直接调用 Main 入口,调用以及输出 调用部分没什么好说的,主要是针对 dynamic 类型的 ...