通俗易懂的卷积神经网络教程-第四讲

大家好,我是小木,没想到吧,我又回来了,哈哈哈哈哈哈哈。大家准备好,一秒钟进入状态,三分钟学完课程吧。没从头读到尾算我输!

昨天我们讲完了正向传播,正向传播的过程还记得吧,首先我们把图片作为输入变量,经过卷积、池化、卷积、池化、BP全连接,求出Y值,然后我们把Y值与标签值相减求出误差,以此类推把所有的图片都这么做,求各个Y值和误差,最后我们把所有的误差取平方后相加,再除以图片的总数,求出均方差MSE。这就是正向传播的过程。

正向传播之后,我们发现MSE值特别特别的大,这说明我们创建的模型不好,图片数字的识别的正确率不高,因此我们要进行的是反向传播,从而减小MSE的值,进而提高图片数字识别的正确率。

首先我们对Sigmoid函数进行求导,这个函数大家没忘记吧:

Y指的是最终的输出变量,y指的是没有sigmoid前的输出变量

它的导数为:

求完了Y的导数,我们下一步要将这个导数乘上误差E=Y-标签,这个值怎么乘呢,首先我们把每一个正向传播的Y值带入到导数中,如果一组有50个图片,那么就会有50Y,每组里面有10个值(Y1~Y10),那么代入公式后,就会得到10Y的导数值,50个图片就会有50组,每组10个导数值。比如我们第一组导数值是:

Y’1

Y’2

...

Y’10

我们用这组导数值与这组正向传播求出的误差值Ei做乘积,我们就会得到10组的数据:

Y’1*E1

Y’2*E2

 

Y’3*E3


我们称这组数据为
▽(delta),如果我们batchsize设定的是有50张图片,那么就我们有了50组delta值(50*10=500个)之后,我们下一步要进行BP全连接的反向传播:

想当初我们正向传播的时候,随机生成了1920个线条,每一个线条对应一个权值wij,用图片可以表示为:

 

现在,我们把这个图颠倒过来了,把求出的delta值导入到橙色小球中作为输入变量,然后通过我们正向传播的权值进行反向传播,也就是用delta值与权值wij相乘。

例如:

我们把第一组delta值导入:第一个橙色小球的值为delta1,我们与w11相乘,得到第一个值;第二个橙色小球的值delta2与w12相乘得到一个值,以此类推,我们可以得到10个值。然后我们把这10个值给加和,这样的话我们就会得到第1个黄色的小球的值。

我们按照同样的方法,用第一个橙色小球的值为delta1,我们与w21相乘,得到第一个值;第二个橙色小球的值delta2与w22相乘得到一个值,以此类推,我们可以得到10个值,然后我们把这10个值给加和,这样的话我们就会得到第2个黄色的小球的值。

同理,我们按照此方式,最终会得到192个黄色小球的值。

这样,我们的BP全连接的反向传播就结束了,用图片表示可以表示为:

 

 

接下来,我们要对BP全连接的上一层,也就是池化层进行反向传播,怎么传播,很简单,听我一一道来:

记得当初我们的图片被压缩成了12个4*4的矩阵,然后 我们把12个4*4的矩阵展开成一列,也就是小黄球,一共192个数据,这次我们在给它还原回去。小黄球里面的值就是不是以前数据的值了,而是在BP全连接反向传播就出来的值,我们给它们起一个名字叫做δk,一共有192个值。

下一步我们就把δk值还原成原来的4*4的矩阵形式,矩阵一共会产生12个,其中数据的顺序一定要是当时打散之前的一样,比如第一个4*4矩阵的第一个元素打散后放到了第一个位置,那么δ1还原回去就是第一个4*4矩阵的第一个元素;第12个矩阵第4行第4列打散之后放置的位置是第192个位置,192位置的δ192一定要放在第12个矩阵第4行第4列。按照这样的顺序还原,最终我们生成了12个4*4的矩阵,如图所示:

 

 

在我们还原之后,这个就是池化层反向传播结束了。

下一步我们要对卷积层进行反向传播,我们现在有12个4*4的矩阵,我们做的是给它扩大成8*8的矩阵,而数量保持12个不变。

首先我们把这12个矩阵的其中一个拿出来,例如这个矩阵是:

接下来我们给它扩大成8*8的矩阵,怎么扩大?看下面的图片就一目了然了:

我们把δ1扩展成了一个2*2的矩阵,其余的也是一样,最后形成了一个8*8的矩阵。为什么扩展成2*2的矩阵呢,因为我们当初正向传播池化过程里,我们的采样器设定是a=2。我们把8*8矩阵变成4*4矩阵叫做池化,也可以叫做向下采样。而我们这次把4*4矩阵还原成8*8的矩阵可以称作向上采样。

同理,我们把12个矩阵中的其它矩阵拿出来进行向上采样,共可以得出12组向8*8矩阵,最后我们把矩阵中的所有元素除以采样器的平方,也就是2*2=4。

我们向上采样到现在还没有完成,为啥呢,很简单,因为我们矩阵中相同的元素太多了。其实这只是我说的。更重要的是我们当初进行卷积的过程中,我们是把原始的数据进行卷积计算。

卷积计算怎么算来着?首先是不是我们把一张28*28的图片通过滤波器给滤波成24*246个矩阵?接下来进行池化计算变成12*126个矩阵,之后再进行一次卷积计算变成8*812个矩阵。就拿8*8的矩阵来说,我们是怎样变成的呢?我们来复习一下:

首先我们生成126*5*5的滤波器,每个滤波器其实是包含有65*5的矩阵。然后我们取第一个滤波器,把12*126个矩阵看成一个整体,第一步,把第一个12*12的矩阵取出来与第一个滤波器中第一个5*5矩阵卷积。第二步,把第二个12*12矩阵取出来与第一个滤波器中的第二个5*5的矩阵卷积。以此类推把所有的矩阵都卷积,最后我们把这6个卷积的结果相加和,形成一个8*8的矩阵,然后我们加上权值b,最后把这个8*8的矩阵数据给sigmoid一下。得到最终的结果。同理我们使用第二个滤波器进行卷积运算。这样我们12个滤波器都计算完毕我们就得到了128*8的矩阵。

我们这次反过来了,首先我们先计算一下sigmoid的导数:

 

算完之后,我们把之前正向传播所得到的8*8矩阵的数值带入到Y中,求出sigmoid的导数。求完之后,我们会得到128*8的导数矩阵。我们用导数矩阵中的每一个值,对应相同位置的向上采样矩阵中的位置,做乘积,这样我们就计算出了8*8的残差矩阵。我们叫它们δδ矩阵吧。用图片表示成如下:

 

这样我们卷积层的反向传播也就完成了。卷积层的反向传播结束之后,我们的三大层反向传播就结束了。但是在前面的层中还有一个池化层、一个卷积层,我们从BP全连接层到池化层的反向传播已经讲过了,而卷积层到池化层的反向传播又应怎么传播呢?预知后事如何,请听第五讲分解!

 

下一讲,反向传播第2轮


————————————————

如果对我的课程感兴趣的话,欢迎关注小木希望学园-微信公众号: 

mutianwei521

也可以扫描二维码哦!


猜你喜欢

转载自blog.csdn.net/u013631121/article/details/80304444