Keras框架简介和使用流程

目录

 

一、 Keras框架简介

1. Models包:keras.models

2. Layers包:keras.layers

3. Initializations包:keras.initializations

4. Activations包:keras.activations、keras.layers.advanced_activations(新激活函数)

5. Objectives包:keras.objectives

6. Optimizers包:keras.optimizers

7. Preprocessing包:keras.preprocessing

8. metrics包:keras.metrics

二、使用流程

1、构造数据

2、构造模型

3、编译模型

4、训练模型

5、测试数据

6、保存与读取模型

7、保存与加载权重数据

三、Keras 源码分析

四、keras中model.evaluate , model.predict和model.predict_classes的区别

五、部分层的使用


一、 Keras框架简介

Keras是基于Theano的一个深度学习框架,它的设计参考了Torch,用Python语言编写,是一个高度模块化的神经网络库,支持GPU和CPU。使用文档在这:http://keras.io/,中文文档在这:http://keras-cn.readthedocs.io/en/latest/ ,这个框架是2015年流行起来的,使用中遇到的困惑或者问题可以提交到github:https://github.com/fchollet/keras。

Keras主要包括14个模块包,可参见文档https://keras.io/layers/ ,下面主要对Models、Layers、Initializations、Activations、Objectives、Optimizers、Preprocessing、metrics八个模块包展开介绍。

1. Models包:keras.models

这是Keras中最主要的一个模块,用于对各个组件进行组装。

详细说明:http://keras.io/models/

from keras.models import Sequential

model = Sequential()  # 初始化模型

model.add(...)  # 可使用add方法组装组件

2. Layers包:keras.layers

该模块主要用于生成神经网络层,包含多种类型,如Core layers、Convolutional layers、recurrent layers、advanced_activations layers、normalization layers、embeddings layers等。

其中Core layers里面包含了flatten(CNN的全连接层之前需要把二维特征图flatten成为一维的)、reshape(CNN输入时将一维的向量弄成二维的)、dense(隐藏层)。

Convolutional layers层包含Theano的Convolution2D的封装等。

详细说明:http://keras.io/layers/

from keras.layers import Dense  # Dense表示BP层

model.add(Dense(input_dim=3,output_dim=5))  # 加入隐含层

3. Initializations包:keras.initializations

该模块主要负责对模型参数(权重)进行初始化,初始化方法包括:uniform、lecun_uniform、normal、orthogonal、zero、glorot_normal、he_normal等。

详细说明:http://keras.io/initializations/

model.add(Dense(input_dim=3,output_dim=5,init='uniform')) #加入带初始化(uniform)的隐含层

4. Activations包:keras.activations、keras.layers.advanced_activations(新激活函数)

该模块主要负责为神经层附加激活函数,如linear、sigmoid、hard_sigmoid、tanh、softplus、softmax、relu以及LeakyReLU、PReLU等比较新的激活函数。

详细说明:http://keras.io/activations/

model.add(Dense(input_dim=3, output_dim=5, activation='sigmoid'))  # 加入带激活函数(sigmoid)的隐含层

等价于:

model.add(Dense(input_dim=3, output_dim=5))

model.add(Activation('sigmoid'))

5. Objectives包:keras.objectives

该模块主要负责为神经网络附加损失函数,即目标函数。如mean_squared_error,mean_absolute_error ,squared_hinge,hinge,binary_crossentropy,categorical_crossentropy等,其中binary_crossentropy,categorical_crossentropy是指logloss。

注:目标函数的设定是在模型编译阶段。

详细说明:http://keras.io/objectives/

model.compile(loss='binary_crossentropy', optimizer='sgd') #loss是指目标函数

6. Optimizers包:keras.optimizers

该模块主要负责设定神经网络的优化方法,如最基本的随机梯度下降SGD,另外还有Adagrad、Adadelta、RMSprop、Adam,一些新的方法以后也会被不断添加进来。

详细说明:http://keras.io/optimizers/

keras.optimizers.SGD(lr=0.01, momentum=0.9, decay=0.9, nesterov=False)

上面的代码是SGD的使用方法,lr表示学习速率,momentum表示动量项,decay是学习速率的衰减系数(每个epoch衰减一次),Nesterov的值是False或者True,表示使不使用Nesterov momentum。

model = Sequential()

model.add(Dense(64, init='uniform', input_dim=10))

model.add(Activation('tanh'))

model.add(Activation('softmax'))

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)

model.compile(loss='mean_squared_error', optimizer=sgd)  #指优化方法sgd

model.compile(loss='binary_crossentropy', optimizer='sgd')

7. Preprocessing包:keras.preprocessing

数据预处理模块,包括序列数据的处理、文本数据的处理和图像数据的处理等。对于图像数据的处理,keras提供了ImageDataGenerator函数,实现数据集扩增,对图像做一些弹性变换,比如水平翻转,垂直翻转,旋转等。

8. metrics包:keras.metrics

与sklearn中metrics包基本相同,主要包含一些如binary_accuracy、mae、mse等的评价方法。

predict = model.predict_classes(test_x)       #输出预测结果

keras.metrics.binary_accuracy(test_y, predict)  #计算预测精度

二、使用流程

1、构造数据

第一步,我们需要根据模型fit(训练)时需要的数据格式来构造数据的shape,用numpy构造两个矩阵:

一个是数据矩阵,一个是标签矩阵,我们举个例子

data=np.random.random((1000,784))
labels=np.random.randint(2,size=(1000,1))

通过numpy的random生成随机矩阵,数据矩阵是1000行784列的矩阵,标签矩阵是1000行1列的句子,所以数据矩阵的一行就是一个样本,这个样本是784维的

2、构造模型

第二步,我们来构造一个神经网络模型

用泛型模型举例:

两种构造model的方法

model = Sequential([ Dense(32, input_dim=784), Activation('relu'), Dense(10), Activation('softmax'), ])

model = Sequential() 
model.add(Dense(32, input_dim=784)) model.add(Activation('relu'))

在这一步中可以add多个层,也可以merge合并两个模型

3、编译模型

第三步,我们编译上一步构造好的模型,并指定一些模型的参数,比如目标函数、优化器等

model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
  • compile方法的三个参数:

optimizer(优化器),loss(目标函数或损失函数),metrics(评估模型的指标) 
具体见上一篇文章

4、训练模型

第四步,传入要训练的数据和标签,并指定训练的一些参数,然后进行模型训练

fit(self, x, y, batch_size=32, nb_epoch=10, verbose=1, callbacks=[], validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None)

 

fit方法参数解析:

verbose:训练时显示实时信息,0表示不显示数据,1表示显示进度条,2表示用只显示一个数据

validation_split:0.2表示20%作为数据的验证集

validation_data:形式为(X,y)的tuple,是指定的验证集。此参数将覆盖validation_spilt。

class_weight:字典,将不同的类别映射为不同的权值,该参数用来在训练过程中调整损失函数(只能用于训练)

sample_weight:权值的numpy array,用于在训练时调整损失函数(仅用于训练)。可以传递一个1D的与样本等长的向量用于对样本进行1对1的加权,或者在面对时序数据时,传递一个的形式为(samples,sequence_length)的矩阵来为每个时间步上的样本赋不同的权。这种情况下请确定在编译模型时添加了sample_weight_mode=’temporal’。

(以上两个参数据说分别为类别权重和样本权重,类别权重没太理解,样本权重貌似就是比如这个样本对分类贡献大,就增加他的权重,有点像TF-IDF,是否是一种注意力机制呢?)

x:输入数据。如果模型只有一个输入,那么x的类型是numpy array,如果模型有多个输入,那么x的类型应当为list,list的元素是对应于各个输入的numpy array

y:标签,numpy array

batch_size:整数,指定进行梯度下降时每个batch包含的样本数。训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步。

nb_epoch:整数,训练的轮数,训练数据将会被遍历nb_epoch次。Keras中nb开头的变量均为”number of”的意思

5、测试数据

第五步,用测试数据测试已经训练好的模型,并可以获得测试结果,从而对模型进行评估。

  • evaluate:
evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None)

 

本函数返回一个测试误差的标量值(如果模型没有其他评价指标),或一个标量的list(如果模型还有其他的评价指标)

  • predict
predict(self, x, batch_size=32, verbose=0)

函数的返回值是预测值的numpy array

  • predict_classes
predict_classes(self, x, batch_size=32, verbose=1)

本函数按batch产生输入数据的类别预测结果

函数的返回值是类别预测结果的numpy array或numpy

还有其他评估指标,具体见: 
http://keras-cn.readthedocs.io/en/latest/models/sequential/


以上就是keras编程常用的五个步骤


6、保存与读取模型

将模型保存为json
json_string = model.to_json()  
将模型保存为yaml
yaml_string = model.to_yaml()  
从保存的json中加载模型  
from keras.modelsimport model_from_json  
model = model_from_json(json_string)  
从保存的yaml中加载模型  
model =model_from_yaml(yaml_string)  

7、保存与加载权重数据

model.save_weights('my_model_weights.h5')  
model.load_weights('my_model_weights.h5')  

以上是根据keras中文文档进行总结与修改的,主要参考 http://keras-cn.readthedocs.io/en/latest

三、Keras 源码分析

https://www.jianshu.com/p/8dcddbc1c6d4

四、keras中model.evaluate , model.predict和model.predict_classes的区别

model.evaluate函数预测给定输入的输出,然后计算model.compile中指定的metrics函数,并基于y_true和y_pred,并返回计算的度量值作为输出。model.evaluate 用于评估您训练的模型。它的输出是准确度或损失,而不是对输入数据的预测。
model.predict只返回y_pred,model.predict 实际预测,其输出是目标值,根据输入数据预测。

在keras中做深度网络预测时,有这两个预测函数model.predict_classes(test) 和model.predict(test)。

本例中是多分类,标签经过了one-hot编码,如[1,2,3,4,5]是标签类别,经编码后为[1 0 0 0 0],[0 1 0 0 0]...[0 0 0 0 1]

model.predict_classes(test)预测的是类别,打印出来的值就是类别号,同时只能用于序列模型来预测,不能用于函数式模型
 

  predict_test = model.predict_classes(X_test).astype('int')

  inverted = encoder.inverse_transform([predict_test])

  print(predict_test)

  print(inverted[0])

   [1 0 0 ... 1 0 0]

   [2. 1. 1. ... 2. 1. 1.]

model.predict(test)预测的是数值,而且输出的还是5个编码值,不过是实数,预测后要经过argmax(predict_test,axis=1)

predict_test = model.predict(X_test)

  predict = argmax(predict_test,axis=1)  #axis = 1是取行的最大值的索引,0是列的最大值的索引

  inverted = encoder.inverse_transform([predict])

  print(predict_test[0:3])

  print(argmax(predict_test,axis=1))

  print(inverted)

    [[9.9992561e-01 6.9890179e-05 2.3676146e-06 1.9608513e-06 2.5582506e-07]

     [9.9975246e-01 2.3708738e-04 4.9365349e-06 5.2166861e-06 3.3735736e-07]

     [9.9942291e-01 5.5233808e-04 8.9857504e-06 1.5617061e-05 2.4388814e-07]]

    [0 0 0 ... 0 0 0]

    [[1. 1. 1. ... 1. 1. 1.]]

相关参考:https://www.quora.com/What-is-the-difference-between-keras-evaluate-and-keras-predict

五、部分层的使用

     5.1  实现两个层layer1和layer2的加权融合

      weight_1 = Lambda(lambda x:x*0.8)
      weight_2 = Lambda(lambda x:x*0.2)
      weight_layer1 = weight_1(layer1)
      weight_layer2 = weight_2(layer2)
      last = Add()([weight_layer1,weight_layer2])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值