精华内容
下载资源
问答
  • 首先是池化层,比较简单 而后是卷积层 先说一下前向传播 第n个bitch,c通道,h,w...前向传播中wx=out,那么反向传播就用dout*x得到dw[0,0,:,:],dw[0,1,:,:],dw[0,2,:,:]。(每个通道) dw[1,:,:,:]也是一样 参考:...

    首先是池化层,比较简单
    在这里插入图片描述
    在这里插入图片描述
    而后是卷积层
    先说一下前向传播
    在这里插入图片描述
    第n个bitch,c通道,h,w为输入的高和宽(这里9x9),用3个3x3的filter提取出3个4x4的特征图(feature map),
    反向传播
    在这里插入图片描述
    前向传播中wx=out,那么反向传播就用dout*x得到dw[0,0,:,:],dw[0,1,:,:],dw[0,2,:,:]。(每个通道)
    dw[1,:,:,:]也是一样的
    在这里插入图片描述
    参考:
    https://www.cnblogs.com/pinard/p/6494810.html
    https://blog.csdn.net/Hearthougan/article/details/72910223
    https://blog.csdn.net/walegahaha/article/details/51945421
    https://zhuanlan.zhihu.com/p/33802329

    展开全文
  • 本文内容同个人微信号推送文章:卷积神经网络的反向传播 ♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,....

    本文内容同个人微信号推送文章:卷积神经网络的反向传播

    本篇博客已经迁移至:https://www.ivdone.top/article/94.html

    展开全文
  • 但是技多不压身,今天我们还是来聊一下卷积神经网络的反向传播。 一、卷积神经网络 如图所示,卷积神经网络先由若干个卷积和池化层进行局部特征识别和降维,之后再用若干全连接层去分类。 每个卷积层+池化层作为一...

    引言

    卷积神经网络一般会借助 TensorFlow 或者 PaddlePaddle 来开发,仅需要开发正向传播,反向传播会自动生成,所以一般不要求掌握。但是技多不压身,今天我们就一起聊一下卷积神经网络的反向传播。

    一、卷积神经网络

    如图所示,卷积神经网络先由若干个卷积和池化层进行局部特征识别和降维,之后再用若干全连接层去分类。

    1. 每个卷积层+池化层作为一组,提取局部特征并降低维度
    2. 经过几组后,图像维度为{W: 1, H: 1, C: n}
    3. 将图像 n 个渠道作为全连接层的输入,相当于 n 个维度
    4. 如果有 m 张图像,则全连接层的输入矩阵为 XnmX_{n*m}
    5. 之后就和深度学习一样了,经过隐藏层和输出层,计算 y^\hat y

    二、卷积神经网络的反向传播

    全连接层的反向传播我们在深度学习中已经讨论过,这里只需要讨论卷积层和池化层的反向传播,最后我们把整个卷积神经网络的反向传播串起来。

    2.1 卷积层的反向传播

    先回顾一下卷积运算:
    A[l1]W[l]+b=Z[l] A^{[l-1]} * W^{[l]} + b = Z^{[l]}

    这里 W 表示卷积核, * 表示卷积运算(对应相乘加和)

    看一个例子。
    [a11  a12  a13a21  a22  a23a31  a32  a33][w11  w12w21  w22]+b=[z11  z12z21  z22] \begin{bmatrix} a_{11}\;a_{12}\;a_{13} \\ a_{21}\;a_{22}\;a_{23} \\ a_{31}\;a_{32}\;a_{33}\end{bmatrix} * \begin{bmatrix}w_{11}\;w_{12}\\ w_{21}\;w_{22}\end{bmatrix} +b = \begin{bmatrix} z_{11}\;z_{12}\\ z_{21}\;z_{22} \end{bmatrix}

    根据卷积运算:

    z11=a11w11+a12w12+a21w21+a22w22+bz12=a12w11+a13w12+a22w21+a23w22+bz21=a21w11+a22w12+a31w21+a32w22+bz22=a22w11+a23w12+a32w21+a33w22+b \begin{aligned} &z_{11} = a_{11}w_{11} + a_{12}w_{12} + a_{21}w_{21} + a_{22}w_{22} + b \\ &z_{12} = a_{12}w_{11} + a_{13}w_{12} + a_{22}w_{21} + a_{23}w_{22} + b \\ &z_{21} = a_{21}w_{11} + a_{22}w_{12} + a_{31}w_{21} + a_{32}w_{22} + b \\ &z_{22} = a_{22}w_{11} + a_{23}w_{12} + a_{32}w_{21} + a_{33}w_{22} + b \end{aligned}

    计算反向传播时,我们已知 dZ[l]dZ^{[l]},分别求 dA[l1]dA^{[l-1]}, dW[l]dW^{[l]}db[l]db^{[l]}

    2.1.1 求解 dA[l1]dA^{[l-1]}

    求解 dA 时与 b 无关,这里可以省略 b。

    • 正向传播

    在这里插入图片描述

    • 反向传播

    思路:原路返回,叠加结果。

    正向传播时 A 的粉色区域通过卷积核生成了 Z 的粉色区域 19。

    反向传播时 dA 初始值为 0。

    dZ 的粉色区域 -1 与 filter 相乘得到(2*2)的区域叠加到 dA 的相应粉色区域。

    在这里插入图片描述

    同样 dZ 的灰色区域 -2 与 filter 相乘得到(2*2)的区域叠加到 dA 的相应灰色区域。

    在这里插入图片描述

    注意到粉色和灰色的重叠区域叠加即可。

    最终经过循环 dZ 的每个元素,将结果在 dA 上叠加,得到最终的 dA。

    在这里插入图片描述

    2.1.2 求解 dW[l]dW^{[l]}

    dW 为 A 的每个区域和 dZ 对应元素的乘积,然后累加到 filter 上。

    • 粉色区域的累加后
      在这里插入图片描述

    • 灰色区域累加后
      在这里插入图片描述

    • 全部累加后的 dW
      在这里插入图片描述

    • 最终的 dW

    考虑到有 m 个样本,所以最终的 dW 还需要在叠加后再除以 m。

    2.1.3 求解 db[l]db^{[l]}

    • db 为 dZ 各个元素的累加和,同样需要再除以样本数 m。

    对于有 Padding,Stride 和多卷积核的反向传播运算都可以利用这一反向传播的思路求解。

    2.2 池化层的反向传播

    池化层主要有两种,分别是最大池化和平均池化。

    2.2.1 最大池化的反向传播

    回顾最大池化的正向传播,每个区域取最大的值。
    在这里插入图片描述

    为了计算反向传播,首先需要记录在正向传播时 max 由哪个位置取得,比如上图粉色区域的 6 由 A 中粉色区域的第 2 行第 2 列取得。

    在这里插入图片描述

    在由 dZ 计算 dA 时,每个 dZ 的元素对应到 dA 的相应区域,在这个区域中,原来取过最大值的位置为 dZ 的元素的值,其他区域为 0。

    在这里插入图片描述

    2.2.2 平均池化的反向传播

    回顾平均池化的正向传播,每个区域取平均值。
    在这里插入图片描述

    反向传播时仅需要将 dZ 的每个元素平均分给相应区域即可。

    在这里插入图片描述

    2.3 卷积神经网络的反向传播

    我们将卷积神经网络分成两个阶段,卷积池化阶段和全连接阶段。

    • 全连接阶段的反向传播按照深度神经网络的反向传播逐层计算。
    • 卷积池化阶段的反向传播按照上文卷积和池化的反向传播逐层计。

    由于卷积神经网络结构复杂, 收敛缓慢。所以每轮更新参数 W, b 时建议采用 Adam 的优化方法。

    后记

    深度学习系列暂时就先聊到这里了。

    下个系列初步考虑聊统计学,比如数学中表示自然指数的 e 是个什么东西,数学中的各种分布应该怎么理解等等,我们下个系列再会。

    欢迎关注本人公众号《大数据茶馆》,用大白话畅聊大数据。

    来的都是客,欢迎您常来坐坐~

    在这里插入图片描述

    展开全文
  • 深层神经网络和卷积神经网络的反向传播过程推导

    万次阅读 多人点赞 2018-08-10 13:37:04
    反向传播过程是深度学习的核心所在,虽然现在很多深度学习架构如...在学习完吴恩达的深度学习课程后,对浅层神经网络的反向传播有了一个很清楚的认识。但在课程中对于深层神经网络和卷积神经网络反向传播过...

    反向传播过程是深度学习的核心所在,虽然现在很多深度学习架构如Tensorflow等,已经自带反向传播过程的功能。我们只需要完成网络结构的正向传播的搭建,反向传播过程以及参数更新都是由架构本身来完成的。但为了更好的了解深度学习的机理,理解反向传播过程的原理还是很重要的。

    在学习完吴恩达的深度学习课程后,对浅层神经网络的反向传播有了一个很清楚的认识。但在课程中对于深层神经网络和卷积神经网络反向传播过程,只给出了反向传播的公式。并没有给出具体的推导过程,所以在这一块之前一直不是很明白。通过最近几天的研究算是大体弄明白了整个过程,接下来写一下自己的心得体会和理解。

    深层神经网络的反向传播过程

    首先,为了量化预测结果的好坏。我们使用损失函数这样一个评价指标,来衡量预测结果与真实标签值之间的误差情况。

    这里给出的是范数形式的损失函数,损失函数当然还可以有其他形式,例如交叉熵形式的等等。但损失函数的自变量都是网络结构中的参数,也就是说只与网络结构中的参数有关。

    例如在这里w表示深层神经网络中所有权重参数的集合,b是每一层神经网络中的偏差,n是样本数量,x是神经网络的输入量,y是预测值,a是标签。前向传播过程:z=wx+b,激活函数y=\sigma (z)

    反向传播过程的推导与偏导数有关,并且都是基于链式法则进行的,接下来进行梯度下降法的推导:

    1.首先是误差函数C关于输出层的L中每一个元素的偏导数

    根据链式法则:

    由于在前向传播过程中,激活函数y=\sigma (z)

    所以可以简化成:

    上式左边项为损失函数C关于输出层L激活值也就是预测值的偏导数。例如,如果损失函数C是二次项的形式,那么关于预测值的偏导数的值:

    实际过程中这一项都是由损失函数决定的。

    用矩阵形式来表示输出层L所有元素的偏导数:

    上式第一项是损失函数C关于预测值的梯度向量,中间这个运算符叫做哈达玛(Hadamard)乘积,用于矩阵或向量之间点对点的乘法运算:

    第二项是激活函数关于输出层z^{^{L}}各元素导数构成的向量

    2.中间层各层的偏导数:

    l层第j个元素的偏导数:

    由于第l+1层中的k个输出值{z_{k}}^{l+1}都含有{z_{j}}^{l}这一项,所以在第二行展开过程中根据函数求导法则,需要对{z_{k}}^{l+1}的k个偏导数进行求和运算。

    又由于:

    求中{w_{kj}}^{l+1}代表第l+1层参数矩阵w的第k行第j列的元素

    求导后得到:

    代入得到:

    写成向量形式:

    3.参数w及偏置b的偏导数:

    这里写图片描述

    写成单个元素的形式:

    这里写图片描述

    4.总结

    这里写图片描述

    卷积神经网络的反向传播过程

    由于CNN的运算过程与DNN不一样,所以CNN的反向传播过程也有所不同。

    首先简单介绍一下CNN的计算过程:

    (1)卷积运算过程

    之后的反向传播的推导也需要用到这个图,记为图1

                                                                                                    图1

    图1描述的是CNN卷积核进行卷积的过程,卷积核与输入矩阵对应位置求积再求和,作为输出矩阵对应位置的值。如果输入矩阵inputX为M*N大小,卷积核为a*b大小,那么输出Y为(M-a+1)*(N-b+1)大小,这里假设步长为1。

    (2)池化运算过程

    上图所示的是最大池化,类似于卷积核在图片上的移动,这里是不断取核中4个值最大的那个值最为输出。平均池化与之类似,只不过输出的是四个位置的平均值。

    (3)全连接层网络

    全连接层的网络计算与之前DNN中的计算一样

    CNN与DNN的不同

    1.池化层在前向传播的时候,对输入进行了压缩,那么我们现在需要向前反向推导\delta ^{l-1},这个推导方法和DNN完全不同。

    2.卷积层是通过张量卷积,或者说若干个矩阵卷积求和而得的当前层的输出,这和DNN很不相同,DNN的全连接层是直接进行矩阵乘法得到当前层的输出。这样在卷积层反向传播的时候,上一层的\delta ^{l-1}递推计算方法肯定有所不同。

    3.对于卷积层,由于W使用的运算是卷积,那么从\delta ^{l}推导出该层的所有卷积核的W,b的梯度方式也不同。

    对于这三个问题,我们一个一个来解决

    已知池化层的\delta ^{l}推导上一层的\delta ^{l-1},这个过程一般称为upsample

    假设池化的size为2*2,\delta ^{l}

                                                                           \delta ^{l}=\begin{bmatrix} 2&3 \\ 4&5 \end{bmatrix}

    由于池化size为2*2,首先将size还原:

                                                                             \begin{bmatrix} 0 &0 &0 &0 \\ 0 & 2 & 3 &0 \\ 0 & 4 & 5 & 0\\ 0 & 0 & 0& 0 \end{bmatrix}

    假设是最大池化,并且之前记录的最大值的位置为左上,右下,右上,左下。那么\delta ^{l-1}:

                                                     \delta ^{\l-1 }=\begin{bmatrix} 2 & 0&0 &0 \\ 0&0 & 0& 3\\ 0&4 & 0 &0 \\ 0&0 & 5& 0 \end{bmatrix}

    解释下为什么要这么做,在正向传播的时候,池化之前的四个最大值位置左上,右下,右上,左下,都以比例为1的系数传递到下一层。而其他位置对输出的贡献都为0,也就是说对池化输出没有影响,因此比例系数可以理解为0。所以在正向传播的过程中,最大值所在位置可以理解为通过函数f(x)=x传递到下一层,而其他位置则通过f(x)=0传递到下一层,并且把这些值相加构成下一层的输出,虽然f(x)=0并没有作用,但这样也就不难理解反向传播时,把\delta ^{l}的各个值移到最大值所在位置,而其他位置为0了。因为由f(x)=x,最大值位置的偏导数为1,而f(x)=0的偏导数为0。

    如果平均池化,那么\delta ^{l-1}

                                             \delta ^{l-1}=\begin{bmatrix} 0.5 &0.5 & 0.75 &0.75 \\ 0.5 &0.5 &0.75 &0.75 \\ 1&1 &1.25 &1.25 \\ 1&1 & 1.25 &1.25 \end{bmatrix}

    平均池化的话,池化操作的四个位置传递到下一层的作用可以等价为f(x)=x/4,所以在方向传播过程中就相当于把\delta ^{l}每一个位置的值乘1/4再还原回去。

    所以由\delta ^{l}推导\delta ^{l-1}可以总结为:

    等式右边第一项表示上采样,第二项是激活函数的导数,在池化中可以理解为常数1(因为池化过程的正向传播过程中没有激活函数)。

    已知卷积层的\delta ^{l}推导上一层的\delta ^{l-1}

    首先由链式法则:

                                                                  {\color{Red} }{\color{Green} {\color{Green} }}\delta ^{l-1}=\frac{\partial C}{\partial z^{l}}\frac{\partial z^{l}}{\partial a^{l-1}}\odot {\sigma }'(z^{l-1})

    rot180({w^{l}})代表对卷积核进行翻转180°的操作,{\sigma }'(z^{l-1})为激活函数的导数。这里比较难理解的是为什么要对卷积核进行180°的翻转。

    假设我们l-1层的输出a^{l-1}是一个3x3矩阵,第l层的卷积核W是一个2x2矩阵,采用1像素的步幅,则输出z^{l}是一个2x2的矩阵。这里暂时不考虑偏置项b的影响。

    那么可得:

    展开:

    a^{l}的梯度:

    又由展开式:

    ^{a_{11}}只与^{z_{11}}有关,并且系数为^{w_{11}},所以:

    ^{a_{12}}只与^{z_{11}}^{z_{12}}有关,并且系数分别为^{w_{11}}^{w_{12}}所以:

    同理:

    使用矩阵形式表示就是:

    这就解释了为什么在反向传播时需要将卷积核进行180°的翻转操作了。

    已知卷积层的\delta ^{l}推导w,b的梯度:

    全连接层中的w,b的梯度与DNN中的推导一致,池化层没有w,b参数,所以不用进行w,b梯度的推导。

    对于卷积层正向传播过程:

    所以参数w的梯度:

    注意到这里并没有翻转180°的操作:

    因为由之前的展开式:

    所以w的梯度:

    这也就是没有进行翻转的原因。

    b的梯度:

    这里假设w=0,那么z=b,梯度\delta ^{^{l}}是三维张量,而b只是一个向量,不能像普通网络中那样直接和\delta ^{^{l}}相等。通常的做法是将误差δ的各个子矩阵的项分别求和,得到一个误差向量所以这里b的梯度就是\delta ^{^{l}}的各个通道对应位置求和:

    得到的是一个误差向量。

    总结一下CNN的反向传播过程:

    1 池化层的反向传播:

    2 卷积层的反向传播

    3 参数更新

    展开全文
  • 此文转载于外文网站 ... 文中对卷积神经网络的反向传播的计算过程,使用了动图表示,理解起来更简单明了。 Forward And Backpropagation in Convolutiona...
  • 本文详细讲解dnn和cnn的反向传播流程。其实无论是dnn还是cnn、pool层,最重要的是,我们要弄清楚反向传播的四个公式,弄清楚他们,我们就明白整个网络是如何运作和优化的,4个核心公式分别是: 1、输出层的误差...
  • CNN前向结构为 一层卷积-》激活函数-》一层池化 当L-1层表示是池化层时候时候 当L-1层表示是池化层时候 L层输出: ata_{t}at​ #池化层 at=σ(zt)a_{t}=\sigma (z_{t})at​=σ(zt​) ↑\uparrow↑ zt=...
  • 卷积神经网络的反向传播算法

    千次阅读 2018-05-06 11:02:23
    matlab的卷积是数学意义上的卷积,在做正向传播的时候需要卷积核反转180度。而CNN中卷积核是需要训练参数,所以反转意义不大。这里转一篇相对靠谱解读,接下来需要看caffe源码,如果与源码对应,那么解释是对...
  • 刘建平博客园 https://www.cnblogs.com/pinard/p/6494810.html
  • 1.传统DNN的反向传播计算: 损失函数: J(W,b,x,y)=12∣∣aL−y∣∣22J(W,b,x,y) = \cfrac{1}{2}||a^L-y||_2^2J(W,b,x,y)=21​∣∣aL−y∣∣22​ δl=∂J∂zl  表示对l层线性变换输出zl的偏导 \delta^l=\frac {\...
  • Backward Propagation-BP in Convolutional Neural Network-CNN 卷积神经网络的反向传播[python代码]简介(个人、代码、传承) 简介(个人、代码、传承) 欢迎大家进入GitHub下载相应代码(success.py)、数据...
  • 这篇文章写得不错,能看懂,分享一下 https://www.jianshu.com/p/8ad58a170fd9
  • 卷积神经网络的反向传播算法(笔记)

    千次阅读 2017-06-21 11:28:42
    全连接神经网络的反向传播算法前向传播参考连接 列举论文中的公式,并与上图所示流程一一对应: 代价函数: EN=12∑n=1N∑k=1c(tnk−ynk)2 E^N = \frac{1}{2}\sum_{n=1}^{N}\sum_{k=1}^{c} (t_k^n-y_k^n)^2为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,177
精华内容 470
关键字:

卷积神经网络的反向传播