深度学习深度学习(十二)从一个经典"Hello World"开始CNN之旅

bigdataway 提交于 周二, 03/20/2018 - 09:26

今天开始CNN介绍了,和之前一样,我们也要从一个简单的实例开始切入,而这次,就是号称机器学习领域的"Hello World"的经典案例开始讲起。

深度学习深度学习(十二)从一个经典

是的就是首先数字识别,而数据集就是著名的--MNIST数据集,这个例子很好理解,可以参考Tensorflow官网,有详细解释,这里会从学习CNN的角度开始解释。

我们用之前掌握的神经网络去学习和识别,那么首先我们要建立输入层单元,输入层单元是什么呢?当然就是每个手写图片的像素了。我们使用的图片是一个28*28的图片例如:

深度学习深度学习(十二)从一个经典

我们把每个像素的灰度值作为一个变量单元,但是我们之前也看到了,输出层单元是单一的矢量,这样,就要求把18*18的矩阵,展平成一个一维的矢量:

深度学习深度学习(十二)从一个经典

如上图,比如一个4*4像素的,表示7的一个图片,就可以展平成上述的方式。

由此,我们就获得了输入层X是一个长度为784(28*28)的向量。

输出层:对于输出层,我们识别的结果无非是0-9,但按照我们之前的学习我们知道,我们不能做单个多值输出,而是要把单个多值输出变成多为0-1的输出,所以,我们的输出层Y就是一个长度为10的向量,其值就是0或者1。第一个值为1,则表示这个图片结果是1,第二个表示为2,如下图:

深度学习深度学习(十二)从一个经典

好了,输入层X有了,输出层Y有了,下面讲解一下隐藏层,我们使用的两层隐藏层,为什么呢?额,我喜欢,当然这是有很长的调试过程,出门左转,看看机器学习的一些调试过程。好了,我们看看结构如下:

深度学习深度学习(十二)从一个经典

ok,大体的模型就这样,当然现在还要决定几个内容:

1. Activation function我们选择什么?

之前也介绍过,为了便于迭代,在隐藏层的Activation Function 我们用relu

而最后一层,因为是要进行分类,我们还是用softmax,softmax是一个用对数做平均数的函数,用于计算最后的实际可能性。

深度学习深度学习(十二)从一个经典

2. 最后就是cost function的定义了,这里果断用交叉熵,用于概率计算是比较好的

好了,最后数据输入,一跑,准确率可以达到98%

TensorFlow上面的例子是跑一个隐藏层的,建议大家实际练手,把TensorFlow的例子按照这个模型跑跑看看结果。

好了,这个就是用深度学习情况下,跑出来的效果,似乎还不错,不过,这里抛出几个问题:

首先,MNIST实际上是一个比较特殊的数据集合,它是被清洗处理过的,他的大小刚好都是28*28以内,而且是居中饱满形式的,试想,如果一个数字其内容只是整个图片的一个角落,而且可能随机分布,同时也不停的带一些旋转,这样的情况,我上述的网络,估计就不好处理了。

另外,我们在制作X层输入层的时候也知道,我们是把一个二维的图片展平成1维的矢量,这样有一个问题,就是在分析过程中,实际上是丢失了图形中的像素和像素之间的关联关系的。

最后,当前图像按照如此展平,光28*28的图形已经有728个输入单元了,如果是高清图形呢,这种情况下,如此巨大的数据,就是上GPU,还能跑的动吗?

而CNN网络,就能很好的解决这个问题!下一章我们来看具体CNN是怎么处理的。

分类