目前总体来说比较流行,表现非常好的算法:

Convolution Nerual Network(CNN)

举个例子:在手写数字识别集 MNIST上面,使用CNN,用gpu计算,deep network ,dropout,ensembles

结果达到接近人肉眼识别水平:9967/10000 识别正确

以下是误识别的图片:

动手实现CNN层的forward函数_算法


右上角是正确数字,右下角是计算机识别到的数字,仔细观察可以看到,计算机识别的准确率还是很好的,上面很多数字都很迷惑,肉眼都很有可能识别错误对于之前的神经网络,相邻两层所有的神经元都两两相连

动手实现CNN层的forward函数_深度学习_02


输入层:图像像素值;输出值:0-9CNN结构不一样,输入是一个二维的神经元(28*28)

动手实现CNN层的forward函数_CNN_03


Local receptive fields:

动手实现CNN层的forward函数_神经网络_04


动手实现CNN层的forward函数_深度学习_05


动手实现CNN层的forward函数_动手实现CNN层的forward函数_06


以5x5的小方格不停地去做卷积,构建到下一层隐藏层的第一层(28-5+1=24,变为24x24)

stride:每次移动的多少,上面我们是一次移动了一格共享权重和偏向(shared weights and biases):

动手实现CNN层的forward函数_深度学习_07


w:5x5

对于第一个隐藏层,所有神经元探测到同样的特征,只是根据不同位置:

动手实现CNN层的forward函数_深度学习_08


更新之后,我们仍然可以保持图像原始的形状特征:

再来介绍另一个概念:Feature map:从输入层转化到输出层

动手实现CNN层的forward函数_深度学习_09

以上3个feature maps,每个是5x5

通常一些表现较好的方法都是使用更多的feature maps:

动手实现CNN层的forward函数_算法_10


以上是根据5x5的feature map学习出的,浅色代表更小的权重(负数),表明CNN在学习共享的权重和偏向(weights,bias)大大减少了参数的数量:

动手实现CNN层的forward函数_动手实现CNN层的forward函数_11


对于每一个feature map,需要5x5=25个权重参数,加上1个偏向,26个

如果有20个feature maps,总共26x20=520个参数就可以定义CNN如果像之前的神经网络,两两相连,需要28x28=784个输入层,加上第一层30个神经元,则需要784x30再加上30个bias,总共23550个参数,多了40倍的参数

动手实现CNN层的forward函数_CNN_12


也可以写成:

动手实现CNN层的forward函数_算法_13


Pooling layers:

浓缩神经网络的代表性,减小尺寸

动手实现CNN层的forward函数_深度学习_14


24x24,2x2 pooling---->12x12

以上是max pooling的方法,在2x2的小方格中,我们取其中的最大值

多个 feature maps:

动手实现CNN层的forward函数_深度学习_15


重要特征点找到之后,绝对位置并不重要,相对位置更重要以上所有的步骤结合在一起:

动手实现CNN层的forward函数_算法_16


还是用之前的backpropagation,gradient descent解决