先回忆第一讲的内容
我们通过把图片数字化,变成一个个的小点,再把小点点给拉成一行,变成自变量。然后我们把图片中的数字作为标签,也就是因变量,我们设定一张图片有10个因变量,这十个变量值是0或1的数字,如果是某位置x是1,那么这个图片中的数字就是x-1。
如果有6W张图,我们会得到6W组这样的变量,这样的变量就是我们输入到卷积神经网络中的输入变量。最后我们会得到一个自变量、标签的表格:
表1
自变量1 | X_1,1 | X_1,2 | ... | X_1,784 |
自变量2 | X_2,1 | X_2,2 | ... | X_2,784 |
... | ... | ... | ... | ... |
自变量6W | X_6W,1 | X_6W,2 | ... | X_6W,784 |
表中,X_a,b指的是第a张图中的第b个自变量。
表2
标签1 | Y_1,1 | Y_1,2 | ... | Y_1,10 |
标签2 | Y_2,1 | Y_2,2 | ... | Y_2,10 |
... | ... | ... | ... | ... |
标签6W | Y_6W,1 | Y_6W,2 | ... | Y_6W,10 |
表中,Y_a,b指的是第a张图中的第b个标签。
我们把这些数据带入到CNN中,就可以开始正向传播了。正向传播分为三个步骤,第一个步骤是卷积、第二步骤是池化、第三步骤是BP网络全连接。前两部也可以分为多步来解决问题,如:“输入数据->卷积1-->池化1->卷积2-->池化2->...->卷积n->池化n->BP网络->输出数据”的形式。
那么我先说一下怎么卷积,我们导入了表1和表2两组数据。首先我们来搞表1:
(1)我们选取表1中的一行,然后把这行的数据还原成28*28的一个矩阵:
有人会说,刚才给拉成一行了,这回又还原了是不是傻啊,脱裤子放屁多此一举嘛!你说的对,确实多此一举。但是你既然能够想到这一点,就说明你第一讲的内容掌握的不错,也就是说我写得文章你看懂了,说明我的讲解奏效了。其实它还有一个作用,我们图片输入进去是一个个的变量,6W组图片就6W组变量,东西太乱了,如果给拉成一行,然后所有数据合并成一组变量,也就是表1,那么看起来是不是也很简洁呢?
(2)还原之后呢,我们随机生成6组滤波器矩阵,每一个矩阵是一个5*5的矩形表格,每一个表格里面都有一个数据,这些数据是随机生成的的值wij。每个滤波器我们在设定一个偏置量值bk,6组就一共有6个偏置量。
(3)然后我们用刚刚从表1拿出来的第一组自变量与第一个滤波器做卷积运算。这个与我们第一节讲的卷积有些不同,我们不再最前面添加0,而是直接从第一个小点开始,我们把5*5的滤波器与自变量矩阵最前面的五行五列对齐,也就是把滤波器放到红色的位置:
(4)之后我们把自变量小格和滤波器对应的位置相乘,如第一个小格与滤波器的第一个值就乘积是X1*W11,第二个乘积就是X2*W12,以此类推,最后一个乘积就是X117*H55。我们得到了25个乘积值,然后我们把乘积给加和,并加上偏置量b1求出D1,1=X1*W11+X2*W12+...+X117*H55+b1。
(5)接下来我们把滤波器往右平移一个格子:
(6)再用滤波器与红色的格子一一对应乘积并求和,并加上偏置量b1得到D1,2=X2*W11+X3*W12+...+X118*H55+b1。
(7)以此类推,一个个地求解,直到到达最后一行:
(8)然后我们求出与滤波器的乘积并求和,并加上偏置量b1,我们可以得到:D1,24==X24*W11+X25*W12+...+X140*H55+b1。到此为止我们求得了24个D。
(9)接下来我们干啥呢返回到我们最开始的对其状况,然后再往下移动一格,如图:
回到原来
接着往下移动一格
(10)然后我们按照上面的(1)~(9)的方法计算D2,1~D2,24,计算完成之后返回:
(11)之后向下移动一格继续计算,直到所有的D都计算完成为止,最后一个D是D24,24。然后我们得到了一格新的24*24的D矩阵:
(12)得到了D矩阵后,我们令这个矩阵编号为d1,然后按照(1)~(11)的方法,用其余的5个滤波器进行计算,其余的5个滤波器后面加的偏置量分别为b2~b5,分别得到了d2~d6。至此我们的卷积过程就完毕了,我们得到了6个卷积矩阵。
(13)我们得到这些所有卷积矩阵之后,我们把得到的所有的值sigmoid一下,给它搞到0~1之间的一个数。这个函数这么写:
其中x指的是矩阵中的每一个值。
如果大家还是没看懂的话,请看下面的图图,图中上面的是得到的新矩阵d,下面是原始的自变量矩阵,自变量矩阵变成深颜色就是与滤波器贴合到了一块:
这一步骤用图像流程图表示是这样的,我们的长度宽度变小了,但是高度变大了(从1变到了6):
看完这张图想必大家对卷积运算的过程就十分地清晰了吧?如果可以我们进行下一步,池化计算。
池化计算和我们第一节讲的一样,设定一个采样器a,比如我们的大小设置为2*2=4,那么我们怎么采样呢,首先我们选取d矩阵的其中之一,比如d1:
(1)我们从左侧头部开始,用采样器框选上前两行两列,如红色框框所示:
(2)然后我们选取这里面的自变量【x1,x2,x25,x26】这四个变量中最大值的一个,比如说最大值是x2,那么我们舍弃其它的变量并令p1,1=x2。
(3)接下来我们把采样器向右移动一次,这次和刚才卷积可不是一样的了,我们这一次的移动一次是按照采样器a的大小来移动的,因为采样器的列数为2,所以向右移动2个小格:
(4)接下来我们选取这四个变量【x3,x4,x27,x28】的最大值,比如说最大值是x27,那么我们舍弃其他的变量并令p1,2=x27。
(5)就这样移动,一直移动到末尾,我们会求得12个p变量,最后一个变量是p1,12。求完之后,我们返回最初的状态:
并向下移动一次,因为a的行数是2,那么我们向下移动2个小格子:
(6)我们再求一下这次的四个变量【x29,x30,x53,x54】的最大值,假设x53是最大值,那么令p2,1=x53。
(7)我们按照(1)~(6)的方法一直遍历,直到我们的红色小框圈到最后四个自变量为止,这样我们就得到了144个p值,最后一个p是p12,12。
(8)我们令这个矩阵为P1,按照同样的方法,我们求出其余6个矩阵的池化结果P2~P6。于是我们得到了6个12*12的矩阵。
这个过程我们可以用图文来进行描述,就是把刚才的矩阵缩小一倍:
我们池化之后,正向传播就完成一半了,接下来就是把这6个12*12的矩阵再进行卷积、池化一次。
怎么再进行呢?问的好!我们把这6个新矩阵的看成一个整体P1拿出来,后随机生成12个5*5*5*5*5*5的新滤波器,然后我们用这个P1矩阵与这12个滤波器做卷积,我们会得到12个8*8的矩阵,我们起名为DD。如图所示:
接着,我们设定一个采样器aa,大小为2*2=4,然后我们对12个矩阵每一个进行采样,就会得到新的12个矩阵PP1~PP12,大小为4*4,如图所示:
我们这两次计算完成之后,我们已经把矩阵的长宽压缩的很小很小了,我们下一步不需要再进行卷积池化了。我们直接用BP神经网络进行全连接就好了。至于怎么全连接呢,请听下回分解。
下一节讲正向传播中:全连接、标签及目标函数的计算。
————————————————
如果对我的课程感兴趣的话,欢迎关注小木希望学园-微信公众号:
mutianwei521
也可以扫描二维码哦!