机器学习系列 八 - 1. Hello World of Deep Learning

Hello World of Deep Learning


使用Keras
Keras其实呢就是TensorFlow或者theano 的一个接口,只是已经进过一些封装是底层更为简单易用。
后台的ThensoFlow和theano是可以进行修改实现的。




我们开始做第一个例子,手写字识别

Keras中mnist数据集测试 下载Keras开发包
>>> conda install git
>>> git clone https://github.com/fchollet/keras.git
>>> cd keras/examples/
>>> python mnist_mlp.py

程序无错进行,至此,keras安装完成。


好了,我们来看深度学习的三步骤

第一步, 选择一个function set 或者叫做 model,
这里我们选用一个四层的model,输入是28*28的,中间两层hidden layer都采用fully connection,
中间的每一次激活函数都使用sigmoid,
最后的激活函数用softmax。

其中Dense(稠密的)表示fully connection全连接。
input_dim 就是输入层维度,只用写一次,因为以后每一层的输入都是上一层的输出,
output_dim就是输出层的维度。
最后一层输出10维度,代表了10个数字。

第二步,判定一个function的好坏
如何evaluate一个function的好坏呢?这里要做的就是model.compile,使用loss函数是crossentropy,
在Keras里面叫做categorical_crossentropy。

第三步,开始做gradient descent 去更新参数找到最好的那个function
既然是gradient descent,那么我们要选择使用比较高效率的版本,有多重不同的gradient descent实现,adam、adagrad、SGD、RMSprop、Adadelta、Adamax、Nadam等等。
然后,我们就要给他进行训练,就需输入 x,就是一些图片。
输出 y 就是训练集得到的结果,也就是输入的图片是对应0-9里哪一个数字。

x_train表示输入的image,[784维图片的pixel * 训练图片数量]; y_train表示输出数字具体是哪一个,[10维 * 训练图片数量]

那怎么吧image存到numpy array里面:

参数 batch_size是什么意思呢?
我们不会真的将所有的数据的loss都算出来以后在全部做加和成为total loss,而是将数据分成一个一个的小数据集batch,分别多线程来做各自的loss,然后 更新参数,之后再加和以提高效率,所以这个batch_size是指定多少个数据指定为一个batch数据集。
然后一个数据集一个数据集的全部都过一遍,那么这个是后,我们把所有数据都看过一次的这种情况叫做one epoch。
那么参数 nb_epoch,就是用来设置重复上面的步骤的次数,将整个数据集走过几遍。


所以,上面这个命令,会让参数总共更新100*20=2000 次。
如果我们将batch_size 设置为1 的话,这个非常像Stochastic gradient descent 随机梯度下降,虽然每次更新参数的方向是不稳定的,但是这样做是非常快的,天下武功唯快不破...虽然出拳比较弱,别人出一拳他可以出100拳,所以比较强!那我们看看是否真的是这样呢?


最主要使用mini batch的理由
快!假设有50000个数据,
如果batch_size =1, 那就相当于 stochastic gradient descent,每个batch有1个数据,那每个epoch里要更新50000次参数。
如果batch_size=10,那就是 mini batch ,每个batch10调数据,每个epoch 更新5000次,效率提高10倍。
因为这里涉及到GPU的 平行运算,所以效率更高!
正因为有平行运算,所以上面batch10个数据是同时运算的。但是batch size也要考虑到硬件极限,不能随意设置太大。
太大的batch size还会带来另一个问题,就是会陷入鞍点或者丘陵地带,会降低stochastic gradient descent的随机性,导致其优势丧失。就会很快卡住。


那么有batch的时候,GPU是怎么平行的加速的呢?
由于在前面讲过Deep Learning可以看做是一连串矩阵运算的结果,不管是forwad pass 、backward pass。

接下来对比batch size = 1和batch size =10的差别,
batch size=1的就是stochastic gradient descent, 他每次随机的选取一组参数进行运算。
batch size=10的就是mini batch, 利用GPU的并行运算能力,每次运算可以将多组数据一起运算,所以效率要高好几倍。

batch_size,   nb_epoch  ['ɛpək]
那么在使用GPU运算的时候一定要记住设置这两个参数,非常有用,可以加快速度。

最后,保存并加载模型,进行计算,
case1 是evaluate,就是说你有两个参数,输入输出你都知道,你就想去测试一个正确率是多少。
case2 是predict,就是提供一个参数,别人给出一个测试数据,你告诉他这个数字是几。



猜你喜欢

转载自blog.csdn.net/hcwj2009/article/details/79988455
今日推荐