Keras框架认识

Posted Caaaaaan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Keras框架认识相关的知识,希望对你有一定的参考价值。

简介

Keras是TensorFlow的接口

MNIST Data: http://yann.lecun.com/exdb/mnist

定义函数集合

定义损失函数

训练

  • 处理训练样本和标签

  • 把Train Data训练成一个个batch,多少个batch—参数设置为batch_size()

    每一个batch里面的样本是随机的

    然后计算每个batch的Loss,每一个batch都会更新一遍参数

    当所有batch都过了一轮之后,称为一个epoch

  • 总共updata参数的次数=epoch*batch_size

  • 每个batch里面只有一个样本时,这个时候是随机梯度下降

    详细回顾文章梯度下降法_Caaaaaan的博客-CSDN博客

  • 好处就是——速度比较快,因为每一道一个样本就是Update一次参数

    虽然每次方向是不稳定的,但天下武功,唯快不破

速度

——为什么不直接用随机梯度下降,而需要使用mini_batch这种方法呢?

  • 小的batch size意味着你在一次epoch里面更新更多次参数

    但是在实作上,同样总量的数据集,batch size的设置不一样,所需要的时间也不一样——也就是完成一个epoch的时间不一样

  • 然后你会发现,updates同样次数的参数,所需要的时间基本上是一样的

    在batch size=10的时候,完成10次epoch,update50000次参数,最终时间所差无几

  • 在时间差异甚微的时候,我们往往会更倾向于寻找batch size更大的一方

    因为batch size更大的一方,update参数的方向更稳定

  • batch size比较大时,我们使用了GPU的并行计算

——那为什么batch size不设置成无穷大?

  • GPU能够同时考虑10个examples,其在一个epoch里,和考虑一个example的时间是一样的

  • 但是GPU存在并行计算的极限,当你同时考虑一万个example的时候,它的时间并不会和考虑一个example的时间是一样的

——抛开硬件限制不谈

  • 如果你的batch size特别大的时候,你的神经网络跑几下就卡住了,就会陷入到鞍点或者局部最小值中

  • 因为在神经网络的error surface上面,它不是一个凸优化问题

    它存在很多的坑坑洞洞,如果你今天的full的batch,就顺着total loss的梯度下降的方向走,就会没走几步就卡住了

  • 设置了mini batch,就等于引入了一些梯度方向的随机性只要你的局部最优点不是特别深,你的鞍点不是特别麻烦的一个鞍点,你只要有一个随机性,就能跳出这个卡住的点

测试

Keras手写数字辨识示例

import numpy as np
from keras.models import Sequential
from keras.layers.core import Dense,Dropout,Activation
from keras.layers import Conv2D,MaxPooling2D,Flatten
from keras.optimizers import SGD,Adam
from keras.utils import np_utils
from keras.datasets import mnist

def load_data():
    (x_train,y_train),(x_test,y_test)=mnist.load_data()
    number=10000
    x_train=x_train[0:number]
    y_train=y_train[0:number]
    x_train=x_train.reshape(number,28*28)
    x_test=x_test.reshape(x_test.shape[0],28*28)
    x_train=x_train.astype('float32')
    x_test=x_test.astype('float32')
    y_train=np_utils.to_categorical(y_train,10)
    y_test=np_utils.to_categorical(y_test,10)
    x_train=x_train
    x_test=x_test

    x_train /= 255
    x_test /= 255

    return (x_train,y_train),(x_test,y_test)

(x_train,y_train),(x_test,y_test)=load_data()
print(x_train.shape) #(10000,784)
print(y_train.shape) #(10000,10)

model=Sequential()
model.add(Dense(input_dim=28*28,units=500,activation='sigmoid'))
model.add(Dense(units=500,activation='sigmoid'))
model.add(Dense(units=10,activation='softmax'))

model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])

model.fit(x_train,y_train,batch_size=100,epochs=20)

result=model.evaluate(x_test,y_test)
print(result[0],result[1],sep='\\n');

以上是关于Keras框架认识的主要内容,如果未能解决你的问题,请参考以下文章

深度学习框架Keras入门案例

深度学习框架Keras入门案例

用Keras解决机器学习问题!

JAVA-初步认识-常用对象API(集合框架-数组和链表)

随机森林 {Keras 由浅入深}

使用 Keras 随机增强图像