使用Python的Keras库可以很容易创建和评测深度学习神经网络,但是您必须遵循严格的模型生命周期。
在这篇文章中,您将了解在Keras中创建,训练和评估深度学习神经网络的模型生命周期的每一步,以及如何使用训练好的模型进行预测。
阅读这篇文章后,你会知道:
- 如何在Keras中定义,编译,拟合和评估深度学习神经网络。
- 如何为回归和分类预测建模问题选取标准默认值。
- 如何将它们结合在一起开发和运行您在Keras的第一个多层感知机网络。
让我们开始吧。
- 2017年3月更新:新增Keras 2.0.2,TensorFlow 1.0.1和Theano 0.9.0的示例。
Keras的深度学习神经网络生命周期
照片由Martin Stitchener
拍摄,保留部分权利。
概观
以下是Keras神经网络模型生命周期中5个步骤的概述。
- 定义网络。
- 编译网络。
- 拟合网络。
- 评估网络。
- 作出预测。
Keras中神经网络模型的5阶生命周期
第1步 定义网络
第一步是定义你的神经网络。
神经网络在Keras中的本质是一系列堆叠起来的层。这些层的容器是Sequential类。
第一步是创建Sequential类的一个实例。然后,您可以创建图层,并按照应有的顺序连接它们。
例如,我们可以分两步进行:
代码语言:txt复制model = Sequential()
model.add(Dense(2))
但是,我们也可以通过创建一个图层数组,并将其传递给Sequential的构造函数来一步完成此操作。
代码语言:txt复制layers = [Dense(2)]
model = Sequential(layers)
网络中的第一层必须定义预期输入的数量。指定的方式可能因网络类型而异,但对于多层感知器模型,这由input_dim
属性指定。
例如,对于一个小型的多层感知机模型,如果第一层接受两个输入数据,中间层有5个神经元,输出层有一个神经元,可以如下定义:
代码语言:txt复制model = Sequential()
model.add(Dense(5, input_dim=2))
model.add(Dense(1))
可以将Sequential模型想象成一个管道,将原始数据输入到底部,然后在顶部输出预测结果。
这种观念在Keras中非常有用,因为传统上在一个图层中完成的各种事情,可以被拆分到多个图层中逐一完成,然后再添加、堆叠起来,这样可以清楚地显示出各个小图层在从输入数据到做出预测这一过程中的数据转换中的作用。例如,我们可以提取每个层中把各个神经元的输出信号的进行求和的激活函数,并将其作为一个新的层,称为Activation层,再添加到Sequential序列中。
代码语言:txt复制model = Sequential()
model.add(Dense(5, input_dim=2))
model.add(Activation('relu'))
model.add(Dense(1))
model.add(Activation('sigmoid'))
激活函数的选择对于输出层来说尤为重要,因为它决定了预测结果的格式。
例如,下面是一些常见预测问题的类型,以及您可以在输出层中使用的结构和标准激活函数:
- 回归:线性激活函数,即"linear”,输出层神经元数量与输出结果的数量要一致。
- 二分类(2类):Logistic激活函数,即“sigmoid”,输出层只有一个神经元。
- 多分类(> 2类):假设使用独热(one-hot)编码输出模式,Softmax激活函数,即“softmax”,输出层神经元数量与要求进行分类的类别数量一致。
第2步 编译网络
一旦我们定义了我们的网络,我们下一步就是编译它。
编译的目的是提高效率。它将我们所定义的简单的图层序列模型转换成一系列可以高效执行的矩阵,这些矩阵的格式取决于你对于Keras的配置。转换后的矩阵可以在你的CPU或GPU上执行。
不妨将编译看作是网络的预计算步骤。
编译是定义模型之后必须进行的步骤。所谓定义模型包括对现有模型采取优化方案,以及从保存的文件中加载一组预先训练的权重。进行编译步骤的原因是它为网络模型准备了一个高效的网络表示,这也是在硬件上进行预测所必需的。
编译需要指定一些参数,为您的网络模型定制训练方案,尤其需要指定的参数是用于训练网络的优化算法和该优化算法所使用的损失函数。
下面是一个展现如何编译定义好的模型的例子,(对于回归问题模型)指定随机梯度下降(sgd)作为优化算法和均方误差(mse)作为损失函数。
代码语言:txt复制# 该model是一个回归问题模型
model.compile(optimizer='sgd', loss='mse')
预测建模问题的类型决定了能够使用哪些损失函数。
例如,下面是不同预测模型类型所使用的一些标准损失函数:
- 回归:均方误差,即“ mse ”。
- 二元分类(2类):对数损失,也称为交叉熵或“ binary_crossentrop ”。
- 多类分类(> 2类):多类对数损失,即“ categorical_crossentropy ”。
您可以查看Keras支持的损失函数套件。
最常见的优化算法是随机梯度下降,但是Keras还支持一些其他的先进优化算法。
某些算法通常具有更好的性能,所以成为了最常用的优化算法,它们应该是:
- 随机梯度下降,即“ sgd ”:需要调整学习速率和动量。
- ADAM,即“ adam ”:需要调整学习速率。
- RMSprop,即' rmsprop ':需要调整学习速率。
最后,除了损失函数之外,还可以指定额外的在拟合模型时测量的指标。一般来说,对于分类问题,最有用的额外指标是的准确性。如果要测量额外的指标,需要在数组中用它们的名字来指定。
例如:
代码语言:txt复制# 在数组中指定需要测量的指标的名字
model.compile(optimizer='sgd', loss='mse', metrics=['accuracy'])
第3步 拟合网络
一旦网络编译完成,就可以进行拟合,其本质是使用训练数据集不断调整网络上各节点的权重。
拟合网络需要指定训练数据,包括与输入层神经元数匹配的矩阵X和与输出层神经元数匹配的向量y。
网络模型会使用反向传播算法进行训练,并根据编译模型时指定的优化算法和损失函数进行优化。
反向传播算法要求对训练数据集指定参数epoch,也就指定要过几遍整个数据集。
每个epoch可以分成几组,每组称为一个batch,每个batch都包含着一批样本数据x及其对应的标记y。这指定了一个epoch内你的网络模型每一次吃进去的数据的数量。这也是一个对效率的优化,确保一次不会有太多的数据被加载到内存中。
拟合网络的一个最简单的例子如下:
代码语言:txt复制# 对整个数据集过100次,每次分10批喂给模型
history = model.fit(X, y, batch_size=10, epochs=100)
拟合完成后,就会返回一个历史对象,这个对象提供了训练过程中模型性能的各种信息的概览,包括损失函数的结果和编译模型时指定的任何其他指标。每个epoch的信息都会记录下来。
第4步 评估网络
网络训练完后,就可以进行评估。
网络可以在训练数据上进行评估,但是这并不能提供关于这个网络预测能力的信息,因为这个网络模型就是在训练数据上建立起来的。
我们可以在另一个在训练时没有用到的数据集上评估网络的性能。这让我们估计这个网络在未来对没有见过的数据进行预测时的性能。
在Keras中,用这个训练好的网络模型在测试数据集上进行测试时,可以看到包括损失函数的结果在内的所有在编译时指定的测量指标的结果,比如分类的准确度。Keras会返回一个包含这些评估指标的list。
例如,对于在编译时指定了使用准确度作为测量指标的模型,我们可以在新数据集上对其进行评估,如下所示:
代码语言:txt复制# 返回一个list:[loss, accuracy]
loss, accuracy = model.evaluate(X, y)
步骤5 进行预测
最后,一旦我们对模型的性能满意,我们就可以用它来预测新的数据。
做法很简单,只需传入一组新的输入数据,调用模型的 predict()
函数。
例如:
代码语言:txt复制predictions = model.predict(x)
预测结果的格式取决于网络的输出层的结构。
在回归问题的情况下,这些预测结果可能就是问题的答案,由线性激活函数产生。
对于二分类问题,预测结果可能是该输入样本属于第一类的概率,这个概率可以通过舍入转换为1或0。
对于多分类问题,结果可能是一个概率数组的形式(假设输出一个one-hot向量),可能需要使用argmax函数将概率数组转换为单个类别。
全过程示例
让我们把所有这些与一个小小的例子结合在一起。
这个例子将使用一个二分类问题:对皮马印第安人是否患糖尿病的诊断,您可以从UCI机器学习库下载。
问题有8个输入变量和一个输出变量,输出值为整数0或1。
我们将构建一个多层感知神经网络,在可见层(输入层)有8个输入神经元,隐层(中间层)中有12个神经元,包含rectifier(relu)激活函数,输出层有1个神经元,带有S形(sigmoid)激活函数。
我们将使用ADAM优化算法和对数损失函数,对batch大小为10的网络进行100个epoch的训练。
拟合完成后,我们将在训练数据上评估模型,然后在训练数据上在进行测。这样做并不正规,只是为了简便而已,正常的情况应该是在单独的测试数据集上评估模型,并对新数据进行预测。
下面提供了完整的代码。
代码语言:txt复制 # 在Keras中使用多层感知机的例子
from keras.models import Sequential
from keras.layers import Dense
import numpy
# 加载数据集,并对数据做预处理
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
X = dataset[:,0:8]
Y = dataset[:,8]
# 1. 定义网络
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# 2. 编译网络
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# 3. 拟合网络
history = model.fit(X, Y, epochs=100, batch_size=10)
# 4. 评估网络
loss, accuracy = model.evaluate(X, Y)
print("nLoss: %.2f, Accuracy: %.2f%%" % (loss, accuracy*100))
# 5. 进行预测
probabilities = model.predict(X)
predictions = [float(round(x)) for x in probabilities]
accuracy = numpy.mean(predictions == Y)
print("Prediction Accuracy: %.2f%%" % (accuracy*100))
运行这个例子将产生下面的输出:
代码语言:txt复制 ...
768/768 [==============================] - 0s - loss: 0.5219 - acc: 0.7591
Epoch 99/100
768/768 [==============================] - 0s - loss: 0.5250 - acc: 0.7474
Epoch 100/100
768/768 [==============================] - 0s - loss: 0.5416 - acc: 0.7331
32/768 [>.............................] - ETA: 0s
Loss: 0.51, Accuracy: 74.87%
Prediction Accuracy: 74.87%
总结
在这篇文章中,你了解了使用Keras库的深度学习神经网络的5阶段生命周期。
具体来说,你了解到:
- 如何在Keras中定义,编译,拟合,评估和预测神经网络。
- 如何为分类和回归问题选择激活函数和配置输出层结构。
- 如何在Keras开发和运行您的第一个多层感知机模型。
你有关于Keras的神经网络模型或关于这个职位的任何问题?在评论中提出您的问题,我会尽我所能来回答。
keras神经网络深度学习keras神经网络深度学习