Python与人工神经网络(12)——卷积神经网络

来源:互联网 发布:京东秒杀抢购软件 编辑:程序博客网 时间:2024/05/21 09:48
前面近十期的内容,我们学习了用浅层次的神经网络识别MNIST手写数字数据集,并且取得了不错的成果,识别率可以超过96%,实际上当隐藏层的神经元数量是100的时候,识别率可以高达98%。在上一期,我们说到了深度神经网络会有更好的效果,然而更难训练。这一期我们将使用一些技术,来训练深度神经网络,这就是卷积神经网络(Convolutional Neural Network)。

卷积神经网络才用了三个概念:局部感受域(Local receptive fields),共享权重(shared weights),和池化(pooling),下面分别介绍。

局部感受域
其实,之前我们使用的神经网络有一个很奇怪的地方:每一层的每个神经元,都与其他层的每个神经元之间有连接。这也就是说,在以前,我们默认,图像的每个像素都与下一层要计算的内容有关联。然而对于图像这种特定的媒介,像素之间有着天然的空间关系,因此我们可以在这上面做文章:我们可以一块区域一块区域的整体往下一层连接,这样的区域,就叫局部感受域。比如我们的图像是28*28像素的,那就可以选取5*5像素作为一个局部感受域,这个范围内的输入神经元连接到下一层的某个神经元,而其他的输入神经元则不连这个神经元,如图:

需要注意,每个5*5的像素范围都应该当作一个局部感受域,都应该对应下一层的一个神经元,28*28的输入神经元,第一层隐藏层有24*24个神经元。也就是说,局部感受域之间,是能有重复的神经元的,如图:

共享权重
在以往的神经网络中,每个神经元都自己的权重w值和偏移量b值。这次,我们使用共享权重和偏移量,也就是说,对于输入层,一个局部感受域,只有只一个权重。用公式表示,隐藏层中第j行第k列的神经元的值就是:

其中w[l][m]就是响应的局部感受域的权重。
局部感受域有啥用呢:直观来说就是特征提取,也就是提取这5*5范围内的一个特征值。所以经常会把这种从输入层到隐藏层的映射叫特征映射,我们用到的共享权重和共享偏移量叫卷积核或者滤波器。
当然一组卷积核,只能提取出一组特征值,所以经常来所,会多用几组,也就是能在相同的区域内检测出多种特征,如图展示了3组的情况:

由于上面的那个方程经常被叫做卷积操作,所以第一个隐藏层也通常被叫做卷积层。
池化
卷积层之后就是池化,也就是简化卷积层的信息。简单来说,池化层从卷积层获取每一个特征值,并将他们进行一个概括。对于24*24的卷积层,我们选一个概括区域比如2*2,找一种方法计算这个范围内的概括值,比如最大值,就得到了池化层的一个神经元的值,如图:

需要注意的是,这次的概括范围之间没有重复了,所以24*24的卷积层,得到的结果是12*12的池化层。刚刚说的最大值,是确有其事,就叫最大值池化法,当然也还有其他方法比如L2池化法等等,这里就不介绍了。
每一个特征图,都应该对应一个池化图:

综合
综合就不用说太多啦,一张图:

最后的十个神经元就是代表十个数字的输出神经元了。
下期,我们就来实现卷积神经网络。

欢迎关注我的微信公众号获取最新文章:

2 0
原创粉丝点击