使用tensorflow初步探究深度学习

1引言:

介绍相关MNIST的知识,介绍tensorflow实现训练模型的基本思路。

2MNIST数据集:

MNIST数据集的官方网站:http://yann.lecun.com/exdb/mnist/
MNIST数据集是由几万张28*28的图片组成,其中每个图片都是手写体的数字0-9十个种类,训练集55000张,测试集10000张。
MNIST的数据集在官网上下载到的是二进制格式的,如下
需要注意的是这些格式的图片并不能直接显示,如果需要查看jpg格式的图片,需要将idx-ubyte格式转成jpg,具体参照参考资料[2]。

2.1使用tensorflow导入MNIST数据集:

tensorflow对与label的表示:使用one-hot类型的变量,就是用一个10维的数组来表示0-9这9个数字。举一个例子,对于0这个类使用[1,0,0,0,0,0,0,0,0,0]来表示,对于5使用[0,0,0,0,1,0,0,0,0,0]来表示。
tensorflow对于训练集的存储采用2阶[55000,784]格式,第一个维度表示有55000张图片,第二个维度表示每一个图片有28*28=784个像素点。那么同样,测试集采用2阶[10000,784]格式。

打开python并输入如下代码导入MNIST:
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

在此,可以查看MNIST数据集中的一些变量,例如:
输入mnist.train,可以查看到mnist.train是tensorflow中的变量和存储的地址。


输入mnist.train.next_batch(20),随机在55000训练集中抽取20个元并和label一起打印出来。相当于在[55000,784]中抽取[20,784]。

3 构建一个简单的BP神经网络

BP是反向传播神经网络,通过使用gradient descent方法来从输出节点反向调整参数,提高w和b参数修改的速度,从而降低训练收敛的时间。
首先需要构建一个简单的BP网络来识别上述的数据集,网络的结构如下:
1.输入层(上图最左边一列):n*784个参数,n表示的是一次从55000个训练集中抓取的用于训练的图片数目。从55000个图片中抓取图片的意思是:由于训练集的样本太大,并且为了减少过拟合和提高训练的准确度,一般会采用每次随机抽取整个训练集中的一部分数据进行训练,抽取若干次直到能够覆盖整个训练集,抽取到的数据有可能有0类若干张,1类若干张...9类若干张,类似于人口普查随机抽取样本。
2.隐层(上图中间一列):隐层的神经元没有激活函数,隐层的每一个神经元直接与输入层相连接。每一个神经元都具有一个w和一个b,是下面所提到的evidence。
3.分类层(上图右侧一列):二分类采用logistic回归分析,而多分类问题采用softmax回归问题。其中logistic和softmax都叫做神经元的激活函数,其目的是加入非线性的成分,最终得出一个概率事件。
构建evidence的具体的思路 请见参考资料[3]。这里重点的介绍一下softmax回归。
设  f(x)=softmax(x),
那么对于softmax的输入x是每张图片的evidence=[12,26,32,-12,206,-1,2,11,0,3],其中第一个维度表示,输入图片是0的evidence是12,;第五个维度表示输入图片是5的evidence是206, 至于evidence是如何得到的参考[3]。那么需要将这些散落在整个实数集R上的数字映射到0~~1区间上,因为概率是0~~1的。因此使用softmax进行映射。
公式:

如果evidence=[3,0,1,-2],那么输出结果是:





4 cost代价函数

经过softmax函数的处理,得到了y  = [x,x,x,x,x,x,x,x,x,x]一阶十维度的向量,这个向量中的每一个维度分别表示对数字0~9的概率,例如y[2]=0.92表示此张图片是数字2的概率是0.92,y中的所有维度的和一定是1。
设此张图片的真实的label是a =[0,0,1,0,0,0,0,0,0,0]表示的是数字2(上面已经讲过了)。那么cost代价函数可以表示为:

也可以采用交叉熵作为cost函数,但是其本质都是判断预测值和真实值的误差,如果使用的是sigmoid激活函数,那么采用交叉熵则是比较优的。
关于交叉熵和二次代价的区别参考[4]。

5 训练过程中调整w和b参数使得cost最小

已经在第4章节中介绍了如何设cost函数,本节讲阐述,通过gradient descent的方法是调整w和b的参数使得cost最小,也代表了构建的模型是最优的。

5.1梯度下降法

梯度的概念和导数类似,说简单的就是导数是针对一元函数而言的,而梯度是针对多元函数的偏导数。如上,我们得出的cost代价函数。
C = cost( softmax(z)) 
z = wx +b
因此,此问题就变为寻找w和b使得C取得最小值  的问题。
如何选取w和b呢,就是使用gradient descent方法。

梯度下降方法:是一个分析性的方法,其本质就是 经过一段步长(这个步长是自己选定),来试探性地不断的调整梯度下降的方向,使得函数始终沿着最快的速度方向下降。

修改w和b的公式:

其中W旧  指的是上一次的全值的值,n表示的是学习速率,就是每一次梯度下降时候的试探性步长。负号表示的是一定是沿着梯度的反方向使得一定是整体下降的过程。这个过程收敛的快慢与以下几个因素有关:
(1)梯度下降法使用的学习速率。
(2)cost代价函数的选取。
(3)激活函数的选取。
(3)w和b初始值的设定。
交叉熵和sigmoid激活函数是一组比较优的组合,证明过程见参考资料[3]

5.2梯度下降法的缺点

(1)容易 收敛到局部最小值
(2)收敛的快慢与选取的初始位置有关
(3)只适用于supervise learning

6.结论

经过上述的model可以得到最简单的BP神经网络模型,左边是输入层,右边是输出层,通过gradient descent方法来不断地训练并且从右侧向左侧修改每个神经元的w和b参数,来使得cost最小。


参考资料:

[1]https://www.tensorflow.org/     tensorflow的官方文档

[2]http://blog.csdn.net/u012507022/article/details/51376626     opencv将手写体格式转图片

[3]http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html   入门机器学习中文教程

[4]http://blog.csdn.net/u014313009/article/details/51043064     二次代价函数和交叉熵的区别。

[5]http://www.cnblogs.com/sdlypyzq/p/4971325.html   使用梯度下降 法修改网络中 的权值。

猜你喜欢

转载自blog.csdn.net/zbzb1000/article/details/53281902