我们今天使用Keras来写一个deep learning model。
tensorflow实际上是一个微分器,它的功能比较强大,但同时也不太好学。因此我们学Keras,相对容易,也有足够的灵活性。
李教授开了一个玩笑:
下面我们来写一个最简单的deep learning model。
即用keras实现mnist手写体数字识别。(识别手写体的数字0-9)
keras可以直接下载这个数据集。
step1:define a function
step2:决定一个function的好坏。
step3:挑选一个最好的function。
x_train和y_train的样子:
实际训练时我们不是用所有的样本,而是用一个mini-batch大小的随机的样本来训练。
如果mini-batch*iteration=样本的总大小,我们就将这iteration次使用mini-batch训练的过程叫做one epoch。
batch_size即mini-batch的大小。nb_epoch即epoch的次数。
为什么每次训练只用mini-batch个样本?主要是为了提升速度。
batch_size不一样时,一个epoch需要的时间不同。
可以看到batch_size等于1时,完成一次epoch的时间是batch_size=10时的10倍,而且batch_size=10时,loss值下降更加稳定,不容易出现震荡。
另外,batch_size太大时的性能表现也不太好,并且更新一次权重需要很长的时间。同时,有一定大小的batch_size可以保证不会因为随机性太强容易走到某个小的local minima位置上去。
矩阵运算时的情况:
对于上面这个网络:
对GPU来说,让它做上述两个运算,所用的时间几乎是一样的,在矩阵相乘中的每一个元素,都是可以并行运算的,所以上面用的时间会变成下面的两倍,所以GPU+mini-batch会使效率大大提升。
在每个epoch时的minibatch应随机地取保证每次都不一样。
加载和保存模型: