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.250.61+0.150.02)0.58(10.58)=0.0364182δ12=(0.250.82+0.150.50)0.57(10.57)=0.068628δ21=(0.250.96+0.150.23)0.65(10.65)=0.04675125δ22=(0.251.00+0.150.17)0.55(10.55)=0.06818625

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

在此处输入图片说明

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


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

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

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

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

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

Answers:


10

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


前传

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

xi,jl=mnwm,nloi+m,j+nl1+bi,jl

k1k2k1=k2=2x0,0=0.25mn

反向传播

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

E=12p(tpyp)2

我们要确定

Ewm,nlmnw0,01=0.13HK

(Hk1+1)(Wk2+1)

44w0,01=0.13x0,01=0.25

Ewm,nl=i=0Hk1j=0Wk2Exi,jlxi,jlwm,nl

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

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

Exi,jl=δi,jl

权重的贡献

卷积定义为

xi,jl=mnwm,nloi+m,j+nl1+bi,jl

从而,

xi,jlwm,nl=wm,nl(mnwm,nloi+m,j+nl1+bi,jl)

m=mn=n

xi,jlwm,nl=oi+m,j+nl1

然后回到我们的错误术语

Ewm,nl=i=0Hk1j=0Wk2δi,jloi+m,j+nl1

随机梯度下降

w(t+1)=w(t)ηEwm,nl

让我们计算一些

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]])

Ew


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


更新:更正的代码


Ewm,nl

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.