通俗易懂的卷积神经网络教程-第三讲
我们复习一下上一节的内容,我们把一张28*28*1图片矩阵通过2次卷积,两次池化过程给它变成了4*4*12的矩阵。
之后呢,我们就要直接用BP神经网络进行全连接。用什么输入变量进行全连接呢?首先我们把这12个4*4的矩阵的其中第一个(PP1)给展开为一条,一共4*4=16个变量:
1 | 2 | ... | 16 |
接着我们把第二个、第三个...一直到第12个矩阵(PP2~PP12)全部给同理展开成为一条,然后我们把所有的行变量合并成一个矩阵:
PP1 | 1 | 2 | ... | 16 |
PP2 | 1 | 2 | ... | 16 |
... | ... | ... | ... | ... |
PP12 | 1 | 2 | ... | 16 |
这样我们就得到了一个12*16=192的矩阵,接下来我们把第二行拼接到第一行末尾,第三行拼接到第二行末尾,以此类推,第12行拼接到71行末尾得到一个1*192的数组:
1 | 2 | ... | 192 |
这样我们放入到BP全连接的输入变量就搞定了,那么怎么进行全连接呢?
(1)根据BP网络的内容我们知道,我们需要输出的结果是和标签变量一样的东西,标签变量是啥来着?我们复习一下:
如果是数字图片,标签中一共因变量Y共有十个值:如果图片中的数字是0,那么第一个格子中就是1,其余的就是0,可以写成:
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
是其他数字的话这张图最后的形式就是:
标签 | Y1 | Y2 | Y3 | Y4 | Y5 | Y6 | Y7 | Y8 | Y9 | Y10 |
其中Y1~Y10是0或者1的数字,如果图片中的数字是X,那么第X+1的位置就是1,其余位置就是0。
(2)我们输出的结果是和标签一样,那么输出的东西就是10个因变量Y,我们一共有输入变量192个,而输出变量是10个,如果把这些小球画出来就是这样的:
(3)这些小球用线连接了起来,那么线一共多少个呢,一个黄色小球对应10个橙色,那么192个黄色小球对应了10*192=1920个线条。有1920个线条就有1920个权值。于是我们生成1920个随机数,作为权值w,我们把第一个输入变量小球对应第一个输出变量小球的权值叫做w1,1,以此类推,把第i个输入变量小球对应第j个输出变量小球的权值叫做wi,j。
(4)我们有权值,还需要一个参数叫做偏置量b,这个需要多少个?输出变量有多少个,就有多少个b,我们这里面有10个,那么就随机生成10个偏置量。我们把第i个输出变量小球对应的偏置量叫做bi。
(5)我们生成权值和偏置量之后,我们用第一个黄色的小球的值与w1,1相乘,然后用第二个小球与w2,1相乘,以此类推第192个小球与w192,1相乘,我们得到了192个值,然后我们把这些值相加,之后再加一个b1,我们就得出了Y1值,也就是第一个橙色输出变量小球的值。
(6)我们用第1个黄色的小球的值与w1,2相乘,然后用第二个小球与w2,2相乘,以此类推第192个小球与w192,2相乘,我们得到了192个值,然后我们把这些值相加,之后再加一个b2,我们就得出了Y2值,也就是第一个橙色输出变量小球的值。
(7)同理求出Y3~Y10。这样我们就得出了10个橙色小球,也就是输出变量值。
(8)但是这样还没有完事儿,我们不能够光输出这样的值,我们应该给Y1~Y10扣上一个sigmoid函数,给它搞到0~1之间的一个数。这个函数这么写:
这两个公式就可以把Yj全部都给算出来,算出来之后,我们就得到了一个1*10的数组:
y1 | y2 | ... | Y10 |
比如这个数组的值是:
0.00 | 0.01 | 0.01 | 0.04 | 0.04 | 0.05 | 0.01 | 0.01 | 0.01 | 0.00 |
我们得到数组之后,我们要做的是什么呢?计算一个目标函数,这个目标函数。这个目标函数应该如何计算我接下来再说。
为什么接下来再说,你们想想,我们上面计算了只是一张28*28的图片,而我们一共输入了6W张图片啊,我们是不是应该也按照上面,也就是从第一节开始到现在的方法把其它的图片都导入进去求Y值呀。但是其它图片太多了,共59999个,我们导入不了怎么办?
于是我们引入另外一个机制,叫做:数据块大小batchsize。我们根据batchsize的值,仅仅导入两位数的图片就好啦。比如我们设定batchsize为50,我们6W张图片的话,就用60000/50=1200组,我们分成1200组分别导入,也就是进行1200次卷积计算,每一组一共导入50张图片。
我们假定先进行第一组训练,我们随机选择50张图片,把其图片以及标签导入进入,然后通过上面的算法把输出的十个变量Y1~Y10都算出来,一共算了50组这样的数据,然后我们把这些Y1~Y10与它们应该一一对应的标签进行相减,然后平方后,相加,比如第一张图的输出值是:
0.00 | 0.01 | 0.01 | 0.04 | 0.04 | 0.05 | 0.01 | 0.01 | 0.01 | 0.00 |
它的标签是:
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
那么我们把它们的对应位置相减:
输出 | 0.00 | 0.01 | 0.01 | 0.04 | 0.04 | 0.05 | 0.01 | 0.01 | 0.01 | 0.00 |
标签 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
相减 | -1 | 0.01 | 0.01 | 0.04 | 0.04 | 0.05 | 0.01 | 0.01 | 0.01 | 0 |
相减之后,我们再把相减的值给平方了:
相减 | -1 | 0.01 | 0.01 | 0.04 | 0.04 | 0.05 | 0.01 | 0.01 | 0.01 | 0 |
平方 | 1 | 0.0001 | 0.0001 | 0.0016 | 0.0016 | 0.0025 | 0.0001 | 0.0001 | 0.0001 | 0 |
之后,我们再把平方后的数据加和为1.0062。
这样我们第一张图就算好了,同理我们算第二、第三。。。一直到第50张图,我们会得到50个结果,我们把这50个结果加和,然后除以50,得到了一个平均值,这个值用术语就叫做MSE平均方差。
我们把第一组batchsize的50个数据求完了,这样,第一次正向传播就结束了。我们今天就讲到这里,下节课再见!
下节课我们讲解反向传播。
————————————————
如果对我的课程感兴趣的话,欢迎关注小木希望学园-微信公众号:
mutianwei521
也可以扫描二维码哦!