首页 > 代码库 > [Keras]-程序流程

[Keras]-程序流程

1.引入库

首先引入keras:

1 import keras

 接下来根据程序需要引入datasets,models,layers等,例如keras github里的cifar-10例程中写到:

1 from keras.datasets import cifar10
2 from keras.preprocessing.image import ImageDataGenerator
3 from keras.models import Sequential
4 from keras.layers import Dense, Dropout, Activation, Flatten
5 from keras.layers import Conv2D, MaxPooling2D

2.构造数据

第一步,我们需要根据模型训练时需要的数据格式来构造数据的shape,有三种方法:

(1)载入他人提供的已经制作好的数据集,如:

 1 (x_train, y_train), (x_test, y_test) = cifar10.load_data() 

(2)使用自己的数据集:由于keras的输入数据必须是二进制形式,所以必须将自己的数据转换成二进制形式才能进行输入。

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

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

data=http://www.mamicode.com/np.random.random((1000,784))
labels=np.random.randint(2,size=(1000,1))
  • 1
  • 2
  • 1
  • 2

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

2、构造模型

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

用泛型模型举例:

两种构造model的方法

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

model = Sequential() 
model.add(Dense(32, input_dim=784)) model.add(Activation(‘relu‘))
  • 1
  • 2
  • 1
  • 2

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

3、编译模型

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

model.compile(optimizer=‘rmsprop‘, loss=‘categorical_crossentropy‘, metrics=[‘accuracy‘])
  • 1
  • 1

compile方法的三个参数:

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

4、训练模型

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

fit(self, x, y, batch_size=32, nb_epoch=10, verbose=1, callbacks=[], validation_split=0.0, validation_data=http://www.mamicode.com/None, shuffle=True, class_weight=None, sample_weight=None)
  • 1
  • 1

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)
  • 1
  • 1

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

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

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

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

本函数按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)  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

7、保存与加载权重数据

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

[Keras]-程序流程