李宏毅机器学习(十)Hello world! DeepLearning

老师这里讲述tensorflow和theano是类似的深度学习工具,他们非常弹性,如果学习起来是比较费事情的(之前学了的确费事,但是不能被老师骗啦)

Keras(英文的意思是牛角)是一种tensorflow或thteano搭建起来的界面,相对前两个比较好学,模型api都经过了封装,当然它也有一定的弹性,如果你想修改模型的话可以通过写tensorflow或者theano代码.Keras作者是谷歌工作人员,所以说以后会封装进tensorflow(已经封装了)

安装keras,我们熟悉不过的pip install keras(虽然我已经安装了tensorflow,而且tensorflow下面有keras,但是为了跟上老师的课程,只有安装独立的keras了)

插图1

课堂上老师举了个图,可能别人不懂或者自己刚接触keras,会对其有很多臆想,实际我们在做的往往是搭积木

插图2

我们使用之前说过的识别手写数字0-9的例子,数据集可以在http://yann.lecun.com/exdb/mnist/下载,当然keras也支持在线下载mnist数据

插图3

我们通过keras实现深度学习还是以往的三个步骤,第一步就是创建模型,

1我们定义model为模型类

2用add添加输出层,当然维度是28*28,输出维度我们这里就先设定为500,模型给添加激活函数sigmoid(当然我们还有图中很多可以选择的激活函数)

3然后添加神经元,因为我们上一层设定了输出,这一层的输入就不用写了,我们设定维度还是500,即这一层是500个神经元的隐层,同样添加激活函数

4最后我们定义输出层,10维,使用的激活函数是softmax作为多分类激活函数

插图4

我们第二步就是用损失函数来评估模型的好坏,我们这里用compile,

loss的参数我们这里使用的是交叉熵(虽然比crossentropy长了一个单词)

插图5

compile第二个参数是选择优化器(这些优化器都是梯度下降的,不过学习率并不需要我们手动指定,他们会自动调整,图中还有其他多种优化器)

下一步是使用fit函数将模型通过数据来拟合,4个参数前两个是训练集的特征参数集合,训练集的目标值集合,后两个等下说

插图6

以手写数字来说x_train,y_train,他俩的类型是numpy的ndarray类型,维度都是2

x_train第一维度是训练集样本数量,第二个维度是特征数量,这里是28*28=784

y_train第一个维度也是训练集样本数量,第二个维度是10,即目标值数量

插图7

我们在深度学习实际使用的损失函数并不是所有样本的损失求和,而是一次随机取出一批数据(这个数据量是固定的),通过计算这批数据的损失和,更新参数,然后再调用新的一批样本数据,再更新参数,直到我们把所有批次都选择到,我们叫做一个epoch(纪元,时代),当然我们往往需要执行N个epoch,这就是compile的后两个参数

插图8

我们图中就是设置了100个数据一批次,当然这个随机选择是程序帮我们做了的,同时重复20遍执行所有数据,当我们把批次数据量设为1时,这时就成了我们以前熟悉的Stochastic gradient descent,即每个样本更新一下数据,这样更新会比较快。那有人就会问了,既然一个样本的批次更新比较快,为什么我们不用这种梯度下降方法呢,我们接下来看。

插图9

我们为了做对比,将50000个手写数字的例子按批次1,10分别训练,前者就有50000次更新数据,后者是5000次更新数据,而实际运行的时间是单个批量的需要166s,10个一批次的需要17s,这些数据是我们使用gtx90做的实验。如果使用更大的批量,我们会时间更短。为什么会导致这样呢,因为我们是使用了gpu矩阵计算单元(前向传播和反向传播都是矩阵的计算)平行计算,所以我们算10个批量的时间和一个的时间几乎是一样的,当然我们也不能把批量设得无限大,这也跟gpu计算单元同时计算能力有关。另一个点是可能我们选的批量过大,可能跑几次梯度下降,就跑到局部最小点了。而设置一定的批量batch_size使每批数据具有一定的随机性,不容易陷到局部最小点。

插图10

模型可以保存或者选择加载。对于训练好的模型,我们有2种使用方式:

1如果测试集有目标值,我们就可以得出模型在测试机的总损失和准确率

2如果测试集没有目标值,我们就可以根据测试集的特征值输入获得其预测值(分类)

插图11

你可能感兴趣的:(李宏毅机器学习(十)Hello world! DeepLearning)