今天 ,小普分享的是Keras 中神经网络模型的 5 步生命周期。
使用 Keras 在 Python 中创建和评估深度学习神经网络非常容易,但您必须遵循严格的模型生命周期。
在这篇文章中,您将了解在 Keras 中创建、训练和评估深度学习神经网络的逐步生命周期,以及如何使用经过训练的模型进行预测。
看完这篇文章你会知道:
- 如何在 Keras 中定义、编译、拟合和评估深度学习神经网络。
- 如何为回归和分类预测建模问题选择标准默认值。
- 如何将它们结合在一起以在 Keras 中开发和运行您的第一个多层感知器网络。
概述
下面是我们将要研究的 Keras 中神经网络模型生命周期中的 5 个步骤的概述。
- 定义网络。
- 编译网络。
- 适合网络。
- 评估网络。
- 作出预测。
步骤 1. 定义网络
第一步是定义你的神经网络。
神经网络在 Keras 中被定义为一系列层。这些层的容器是 Sequential 类。
第一步是创建 Sequential 类的实例。然后,您可以创建图层并按照它们应该连接的顺序添加它们。
例如,我们可以分两步完成:
model = Sequential()
model.add(Dense(2))
但是我们也可以通过创建一个层数组并将其传递给 Sequential 的构造函数来一步完成。
layers = [Dense(2)]
model = Sequential(layers)
网络中的第一层必须定义预期的输入数量。指定的方式可能因网络类型而异,但对于多层感知器模型,这是由 input_dim 属性指定的。
例如,一个小型多层感知器模型,可见层有 2 个输入,隐藏层有 5 个神经元,输出层有一个神经元,可以定义为:
model = Sequential()
model.add(Dense(5, input_dim=2))
model.add(Dense(1))
将 Sequential 模型视为一个管道,原始数据输入在底部,预测结果在顶部。
这在 Keras 中是一个有用的概念,因为传统上与层相关的关注点也可以拆分并添加为单独的层,清楚地显示它们在从输入到预测的数据转换中的作用。例如,可以提取转换层中每个神经元的求和信号的激活函数,并将其作为称为激活的层状对象添加到序列中。
model = Sequential()
model.add(Dense(5, input_dim=2))
model.add(Activation('relu'))
model.add(Dense(1))
model.add(Activation('sigmoid'))
激活函数的选择对于输出层来说是最重要的,因为它将定义预测将采用的格式。
例如,以下是一些常见的预测建模问题类型以及您可以在输出层中使用的结构和标准激活函数:
- 回归:线性激活函数或“线性”以及与输出数量匹配的神经元数量。
- 二元分类(2 类):逻辑激活函数或“sigmoid”和一个神经元作为输出层。
- 多类分类(>2 类):Softmax 激活函数或“softmax”和每个类值一个输出神经元,假设一个热编码输出模式。
步骤 2. 编译网络
一旦我们定义了我们的网络,我们就必须编译它。
编译是一个效率步骤。它将我们定义的简单层序列转换为一系列高效的矩阵转换,其格式旨在在您的 GPU 或 CPU 上执行,具体取决于 Keras 的配置方式。
将编译视为网络的预计算步骤。
定义模型后总是需要编译。这包括在使用优化方案对其进行训练之前以及从保存文件中加载一组预训练的权重。原因是编译步骤准备了网络的有效表示,这也是对您的硬件进行预测所必需的。
编译需要指定许多参数,专门用于训练您的网络。特别是用于训练网络的优化算法和用于评估被优化算法最小化的网络的损失函数。
例如,下面是一个编译定义模型并指定随机梯度下降 (sgd) 优化算法和均方误差 (mse) 损失函数的案例,用于回归类型问题。
model.compile(optimizer='sgd', loss='mse')
预测建模问题的类型对可以使用的损失函数的类型施加了限制。
例如,以下是不同预测模型类型的一些标准损失函数:
- 回归:均方误差或“ mse ”。
- 二元分类(2 类):对数损失,也称为交叉熵或“ binary_crossentropy ”。
- 多类分类(>2 类):多类对数损失或“ categorical_crossentropy ”。
也许最常用的优化算法是因为它们通常具有更好的性能:
- 随机梯度下降或“ sgd ”,需要调整学习率和动量。
- 需要调整学习率的ADAM或“ adam ”。
- 需要调整学习率的RMSprop或“ rmsprop ”。
最后,除了损失函数之外,您还可以在拟合模型时指定要收集的指标。通常,要收集的最有用的附加指标是分类问题的准确性。要收集的指标由数组中的名称指定。
例如:
model.compile(optimizer='sgd', loss='mse', metrics=['accuracy'])
步骤 3. 拟合网络
一旦网络被编译,它就可以被拟合,这意味着在训练数据集上调整权重。
拟合网络需要指定训练数据,包括输入模式 X 的矩阵和匹配输出模式 y 的数组。
网络使用反向传播算法进行训练,并根据编译模型时指定的优化算法和损失函数进行优化。
反向传播算法要求对网络进行指定数量的 epoch 或对训练数据集的曝光训练。
每个 epoch 都可以划分为称为批次的输入-输出模式对组。这定义了在一个时期内更新权重之前网络暴露的模式数量。这也是一种效率优化,确保一次不会将太多输入模式加载到内存中。
拟合网络的最小示例如下:
history = model.fit(X, y, batch_size=10, epochs=100)
拟合后,将返回一个历史对象,该对象提供模型在训练期间的性能摘要。这包括在编译模型时指定的损失和任何其他指标,记录每个时期。
步骤 4. 评估网络
一旦网络被训练,它就可以被评估。
可以根据训练数据对网络进行评估,但这并不能提供作为预测模型的网络性能的有用指示,因为它之前已经看到了所有这些数据。
我们可以在测试期间看不到的单独数据集上评估网络的性能。这将提供对网络在未来对看不见的数据进行预测时的性能估计。
该模型评估所有测试模式的损失,以及编译模型时指定的任何其他指标,如分类准确性。返回评估指标列表。
例如,对于使用准确度指标编译的模型,我们可以在新数据集上对其进行评估,如下所示:
loss, accuracy = model.evaluate(X, y)
第 5 步。做出预测
最后,一旦我们对拟合模型的性能感到满意,我们就可以使用它对新数据进行预测。
这就像使用一组新输入模式在模型上调用 predict() 函数一样简单。
例如:
predictions = model.predict(x)
预测将以网络输出层提供的格式返回。
在回归问题的情况下,这些预测可能直接采用问题的格式,由线性激活函数提供。
对于二元分类问题,预测可能是第一类的概率数组,可以通过舍入转换为 1 或 0。
对于多类分类问题,结果可能采用概率数组的形式(假设一个热编码输出变量),可能需要使用argmax 函数将其转换为单类输出预测。
端到端工作示例
让我们通过一个小的工作示例将所有这些联系在一起。
这个例子将使用 Pima Indians 发病二元分类问题。
下载数据集并将其保存到您当前的工作目录。
该问题有 8 个输入变量和一个具有整数值 0 和 1 的输出类变量。
我们将构建一个多层感知器神经网络,可见层有 8 个输入,隐藏层有 12 个神经元,具有整流激活函数,输出层有 1 个神经元,具有 sigmoid 激活函数。
我们将使用 ADAM 优化算法和对数损失函数对网络进行 100 个 epoch 的训练,批量大小为 10。
一旦拟合,我们将在训练数据上评估模型,然后对训练数据进行独立预测。这是为了简洁起见,通常我们会在单独的测试数据集上评估模型并对新数据进行预测。
下面提供了完整的代码清单。
# Sample Multilayer Perceptron Neural Network in Keras
from keras.models import Sequential
from keras.layers import Dense
import numpy
# load and prepare the dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
X = dataset[:,0:8]
Y = dataset[:,8]
# 1. define the network
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# 2. compile the network
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# 3. fit the network
history = model.fit(X, Y, epochs=100, batch_size=10)
# 4. evaluate the network
loss, accuracy = model.evaluate(X, Y)
print("\nLoss: %.2f, Accuracy: %.2f%%" % (loss, accuracy*100))
# 5. make predictions
probabilities = model.predict(X)
predictions = [float(round(x)) for x in probabilities]
accuracy = numpy.mean(predictions == Y)
print("Prediction Accuracy: %.2f%%" % (accuracy*100))
运行此示例会产生以下输出:
注意:您的结果可能会因算法或评估程序的随机性或数值精度的差异而有所不同。考虑运行该示例几次并比较平均结果。
...
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 中的神经网络模型或这篇文章有任何疑问吗?在评论中提出您的问题,小普会尽力回答。