【李宏毅ML笔记】 12 Keras Hello word
可以自己修改keras背后的TensorFlow相关的配置,程序,来做更灵活的事情。
keras(牛角)作者在谷歌工作,可能会作为谷歌神经网络api。
如下,
keras中先定义sequential的model,先决定set of function
然后搭积木,model中可以加一层layer,用add Dense()(这是fully connected layer),或者其它的形式。
并输入相关的参数(输入维度,输出维数)
定义Neuron中最后一步的**函数activation(),也可以自定义
可以继续加layer和**函数,隐层中,不需要加入input了,因为直接用的上一层的。
最后加一output layer层设置为输出的维数,以及**函数。
定义evaluation function,使用model.compile(loss, optimizer, metrics)
Step3.1配置,如下是Training部分,确定用什么样的方式找参数,找最好的方式。optimizer可以设置不同方式训练network,都是基于gradient descent方式。不同之处在于,有的方式会自动设置learning rate,各式各样的。
Step.3.2 配置完,就是给其训练数据data和label,设置具体训练计算过程如停止时间的参数。
具体的,先将xtrain,image存到numpy array中,第一个dimension代表有多少个example,第二个代表image有多少个pixel(特征28*28),ytrain第一个dimension就是examples个数,第二个dimension就是10维,代表第i个example的值。
fit中参数,batch_size 在做gradient descent时,并不会完全的minimize,而是将training data分为多个batch,比如每次选100张图作为一个batch。一个batch要随机分,尽量包含各种样本的y值。
1. 随机初始化Network中的w和b所有参数。
2. 随机选一个batch,计算batch1中的total loss=L',根据L' update一次Network中的参数
3. 随机选第二个batch,计算L'',计算wb对L的偏微分。
4 直到用了所有的batch,这一次过程叫做一个epoch。按照epoch重复以上工作。
注意,在一个epoch里update很多次参数如k词,则m个epoch中,则update一共k*m次参数。
为什么要用mini-batch呢?主要原因是speed。batchsize偏大时,速度比较快(用了平行计算,如gpu,但受限于GPU的能力,太大则容易卡住),且Network比较稳定。
所以,mini-batch的随机性,可以防止神经网络在训练时被卡主。那么有了mini-batch时,GPU是如何加速计算的?
如下,整个Network,可以看做是一连串的矩阵运算的结果。不管是forward pass,还是backward pass(逆转Network,你向neutron)。
如下,为什么mini-batch比SGD快?
如果batchsize=1,则下面比较快,GPU可以在matrix相乘时可以加速。普通情况下,没有GPU,是一样的。
所以,使用GPU,就要设置mini-batch
如下,可保存模型,以后可读出来,也也可以做testing
作业: