CNN中的反向传播


16

我有以下CNN:

网络布局

  1. 我从5x5大小的输入图片开始
  2. 然后,我使用2x2内核和stride = 1进行卷积,生成大小为4x4的特征图。
  3. 然后,我将2x2 max-pooling应用于stride = 2,这会将要素图缩小为2x2。
  4. 然后我应用逻辑乙状结肠。
  5. 然后是一层完全连接的带有2个神经元的层。
  6. 并有输出层。

为了简单起见,假设我已经完成了前向通过并计算出δH1= 0.25和 δH2= -0.15

因此,在完成完全向前传递和部分完成向后传递之后,我的网络如下所示:

前传后的网络

然后,我为非线性层(逻辑Sigmoid)计算增量:

δ11=(0.25∗0.61+−0.15∗0.02)∗0.58∗(1−0.58)=0.0364182δ12=(0.25∗0.82+−0.15∗−0.50)∗0.57∗(1−0.57)=0.068628δ21=(0.25∗0.96+−0.15∗0.23)∗0.65∗(1−0.65)=0.04675125δ22=(0.25∗−1.00+−0.15∗0.17)∗0.55∗(1−0.55)=−0.06818625

然后,我将增量传播到4x4层,并将所有通过最大池滤除的值设置为0,渐变图如下所示:

在此处输入图片说明

如何从那里更新内核权重?如果我的网络在5x5之前有另一个卷积层,那么我应该使用什么值来更新它的内核权重?总体而言,我的计算正确吗?


请澄清造成您困惑的地方。您已经知道如何进行最大值的导数(除最大值为零外,其他均为零)。因此,让我们忘记最大池。是卷积中的问题吗?每个卷积补丁都有自己的导数,这是一个缓慢的计算过程。
— 里卡多·克鲁兹

最好的资料是深度学习书 -坦白说,这不是一本容易阅读的书:)。第一个卷积与将图像分成小块然后应用正常的神经网络相同,每个像素都使用权重连接到您拥有的“过滤器”数量。
— 里卡多·克鲁兹

1
从本质上来说,您的问题是否是通过使用反向传播来调整内核权重的?
— JahKnows

@JahKnows ..,以及给出的示例,如何为卷积层计算梯度。
— koryakinp

卷积层是否有关联的激活函数?
— JahKnows

Answers:


10

卷积采用权重分配原则,这将使数学显着复杂化,但让我们尝试克服杂草。我从这个消息来源汲取了大部分的解释。


前传

如您所见,卷积层的前向通过可以表示为

xi,jl=∑m∑nwm,nloi+m,j+nl−1+bi,jl

k1k2k1=k2=2x0,0=0.25mn

反向传播

假设您使用的均方误差(MSE)定义为

E=12∑p(tp−yp)2

我们要确定

∂E∂wm′,n′lm′n′w0,01=−0.13HK

(H−k1+1)(W−k2+1)

44w0,01=−0.13x0,01=0.25

∂E∂wm′,n′l=∑i=0H−k1∑j=0W−k2∂E∂xi,jl∂xi,jl∂wm′,n′l

这会遍历整个输出空间,确定输出正在产生的误差,然后确定相对于该输出的内核权重的贡献因子。

为了简单起见并跟踪向后传播的误差,让我们从输出空间增量中得出误差的贡献,

∂E∂xi,jl=δi,jl

权重的贡献

卷积定义为

xi,jl=∑m∑nwm,nloi+m,j+nl−1+bi,jl

从而,

∂xi,jl∂wm′,n′l=∂∂wm′,n′l(∑m∑nwm,nloi+m,j+nl−1+bi,jl)

m=m′n=n′

∂xi,jl∂wm′,n′l=oi+m′,j+n′l−1

然后回到我们的错误术语

∂E∂wm′,n′l=∑i=0H−k1∑j=0W−k2δi,jloi+m′,j+n′l−1

随机梯度下降

w(t+1)=w(t)−η∂E∂wm′,n′l

让我们计算一些

import numpy as np
from scipy import signal
o = np.array([(0.51, 0.9, 0.88, 0.84, 0.05), 
              (0.4, 0.62, 0.22, 0.59, 0.1), 
              (0.11, 0.2, 0.74, 0.33, 0.14), 
              (0.47, 0.01, 0.85, 0.7, 0.09),
              (0.76, 0.19, 0.72, 0.17, 0.57)])
d = np.array([(0, 0, 0.0686, 0), 
              (0, 0.0364, 0, 0), 
              (0, 0.0467, 0, 0), 
              (0, 0, 0, -0.0681)])

gradient = signal.convolve2d(np.rot90(np.rot90(d)), o, 'valid')

数组([[0.044606,0.094061],[0.011262,0.068288]])

∂E∂w


如果推导中有错误,请告诉我。


更新:更正的代码


∂E∂wm′,n′l

1
gradient = signal.convolve2d(np.rot90(np.rot90(d)), o, 'valid')
— 太阳蜜蜂

我想建议复习此答案。特别是,可能会检查python中提供的代码
— Duloren
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.