畅游人工智能之海--Keras教程之Sequential模型篇

畅游人工智能之海--Keras教程之Sequential模型篇

各位读者大家好,今天我们就要开始正式地进行Keras的学习了。相信大家都读过了Keras的知识结构那篇文章,我们把Keras的模型讲解放在了最前面。这样布局是为了让大家先对Keras实现神经网络的整体架构了然于胸,在之后的学习中便可以找到其他的零碎知识点在框架中的位置,更有利于大家对Keras的学习。废话不多说,下面我们就开始吧!

Sequential模型,顾名思义,它是一个线性模型,即多个网络层进行线性堆叠构成Sequential模型。Sequential模型的构造方法有两种:一种是将网络层实例的列表传递给Sequential的构造器来创建一个Sequential模型;另一种是使用.add()方法将各层添加到模型中。

1
2
3
4
5
6
7
8
9
10
11
#方法一
model = Sequential([
Dense(32, input_shape=(784,)),
Activation('relu'),
Dense(10),
Activation('softmax'),
])
#方法二
model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))

这样,一个简单的模型就搭好了。但是这样的模型是没有经过训练的,无法完成我们想要的功能。若是想对模型进行训练,我们还需要选择优化器、loss函数、评估标准等,使用compile方法对模型进行配置。之后才能使用训练数据对模型进行训练。

在这之前,模型需要知道它所期望的输入的尺寸(只需要告诉第一层输入尺寸信息,之后的层会自行推导。有以下几种方法完成这一任务:①使用input_shape参数传递给第一层,它是一个表示尺寸的元组;②某些2D层支持通过参数input_dim输入尺寸,某些3D时序层支持input_dim和input_length参数。如果想要为输入指定固定的batch大小,可以传递batch_size参数给一个层。下面两行代码是等价的。

1
2
model.add(Dense(32, input_shape=(784,)))
model.add(Dense(32, input_dim=784))

上面提到,我们在训练模型之前需要用compile方法对学习过程进行配置,基本的代码如下:

1
2
3
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])

optimizer就是优化器,loss就是损失函数,metrics就是评估标准。通过输入等号后面的内容可以针对不同的训练任务进行不同的选择。

在完成配置过程之后,我们便可以用fit方法对模型进行训练。代码如下:

1
model.fit(data, labels, epochs=10, batch_size=32)

其中data就是训练集,labels是对应的标签,epochs是训练轮数,batch_size是批大小。

除了上面提到的这些,Sequential模型还有一些其他的API(具体参数含义可以查看Keras文档):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#根据名称(唯一)或索引值查找网络层,如果同时提供了 name 和 index,则 index 将优先。
get_layer(name=None, index=None)
#在测试模式,返回误差值和评估标准值
evaluate(x=None, y=None, batch_size=None, verbose=1, sample_weight=None, steps=None)
#为输入样本生成输出预测
predict(x, batch_size=None, verbose=0, steps=None)
#一批样品的单次梯度更新
train_on_batch(x, y, sample_weight=None, class_weight=None)
#在一批样本上评估模型
test_on_batch(x, y, sample_weight=None)
#返回一批样本的模型预测值
predict_on_batch(x)
#使用 Python 生成器或 Sequence 实例逐批生成的数据,按批次训练模型
fit_generator(generator, steps_per_epoch=None, epochs=1, verbose=1, callbacks=None, validation_data=None, validation_steps=None, class_weight=None, max_queue_size=10, workers=1, use_multiprocessing=False, shuffle=True, initial_epoch=0)
#在数据生成器上评估模型
evaluate_generator(generator, steps=None, max_queue_size=10, workers=1, use_multiprocessing=False, verbose=0)
#为来自数据生成器的输入样本生成预测
predict_generator(generator, steps=None, max_queue_size=10, workers=1, use_multiprocessing=False, verbose=0)

接下来,我们来结合一个实例来梳理一下Sequential模型整体流程,以基于多层感知器的二分类为例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout

# 生成虚拟数据
x_train = np.random.random((1000, 20))
y_train = np.random.randint(2, size=(1000, 1))#训练集标签
x_test = np.random.random((100, 20))
y_test = np.random.randint(2, size=(100, 1))#测试集标签
#Sequential构造器,采取.add()方式构造模型
model = Sequential()
#第一层要指定输入尺寸,这里输入尺寸为一个20维的向量
model.add(Dense(64, input_dim=20, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
#配置模型的学习过程。选择的优化器为'rmsprop',损失函数为'binary_crossentropy',评估标准为'accuracy'
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
#开始用训练集训练模型,轮数为20,批大小为128
model.fit(x_train, y_train,
epochs=20,
batch_size=128)
#用测试集评估模型并打分
score = model.evaluate(x_test, y_test, batch_size=128)

以上就是一个基本流程,关键点在注释里标注。

接下来大家会想,我们辛辛苦苦训练好了一个模型难道程序结束就没有了么?所以我们要采取一些方法保留模型,Keras提供了一些方法。

最完整的保存方法为model.save(filepath),这个方法将Keras模型保存到单个HDF5文件中,该文件包括:模型的结构,允许重新创建模型;模型的权重;训练配置项(损失函数,优化器);优化器状态,允许准确地从你上次结束的地方继续训练。之后还可以使用keras.models.load_model(filepath)重新实例化模型。还有只保存或加载模型的结构的方法:model.to_json(),model.to_yaml();model_from_json(json_string),model_from_yaml(yaml_string)。还有只保存或加载模型的权重的方法:model.save_weights(filepath);model.load_weights(filepath)

相信如果你能掌握这篇文章的内容,就可以自行构造一个Sequential模型啦!关于优化器等等关键参数的选择背后也有很深的学问,这关系到大家处理具体问题时的选择,希望大家在这篇文章之外多多去探索他们背后的学问,一起加油吧!