Keras是一个功能强大且易于使用的免费开源 Python 库,用于开发和评估_深度学习模型_。
它封装了高效的数值计算库Theano和TensorFlow,让您只需几行代码即可定义和训练神经网络模型。
在本教程中,您将了解如何使用 Keras 在 Python 中创建您的第一个深度学习神经网络模型。
Keras 教程概述
不需要很多代码,但我们会慢慢地跨过它,以便您将来知道如何创建自己的模型。
您将在本教程中介绍的步骤如下:
-
加载数据。
-
定义 Keras 模型。
-
编译 Keras 模型。
-
适合 Keras 模型。
-
评估 Keras 模型。
-
把这一切联系在一起。
-
作出预测
这个 Keras 教程有一些要求:
-
您已经安装并配置了 Python 2 或 3。
-
您已经安装并配置了 SciPy(包括 NumPy)。
-
您已经安装并配置了 Keras 和后端(Theano 或 TensorFlow)。
如果您需要环境方面的帮助,请参阅教程:
- 如何为深度学习设置 Python 环境
创建一个名为keras_first_network.py的新文件,并在执行过程中键入或复制并粘贴代码到该文件中。
1.加载数据
第一步是定义我们打算在本教程中使用的函数和类。
我们将使用NumPy 库加载我们的数据集,我们将使用Keras 库中的两个类来定义我们的模型。
下面列出了所需的进口。
# first neural network with keras tutorial from numpy import loadtxt from keras.models import Sequential from keras.layers import Dense ... |
我们现在可以加载我们的数据集。
在本 Keras 教程中,我们将使用皮马印第安人糖尿病发病数据集。这是来自 UCI 机器学习存储库的标准机器学习数据集。它描述了皮马印第安人的患者病历数据,以及他们是否在五年内患上糖尿病。
因此,这是一个二元分类问题(糖尿病的发病为 1 或不为 0)。描述每个患者的所有输入变量都是数字变量。这使得它很容易直接与需要数值输入和输出值的神经网络一起使用,并且非常适合我们在 Keras 中的第一个神经网络。
数据集可从这里获得:
-
数据集 CSV 文件 (pima-indians-diabetes.csv)
-
数据集详情
下载数据集并将其放在本地工作目录中,与 python 文件的位置相同。
用文件名保存它:
pima-indians-diabetes.csv |
查看文件内部,您应该会看到如下所示的数据行:
6,148,72,35,0,33.6,0.627,50,1 1,85,66,29,0,26.6,0.351,31,0 8,183,64,0,0,23.3,0.672,32,1 1,89,66,23,94,28.1,0.167,21,0 0,137,40,35,168,43.1,2.288,33,1 ... |
我们现在可以使用 NumPy 函数loadtxt()将文件加载为数字矩阵。
有八个输入变量和一个输出变量(最后一列)。我们将学习一个模型,将输入变量 (X) 的行映射到输出变量 (y),我们通常将其总结为_y = f(X)_。
这些变量可以总结如下:
输入变量 (X):
-
怀孕次数
-
口服葡萄糖耐量试验中 2 小时的血浆葡萄糖浓度
-
舒张压 (mm Hg)
-
三头肌皮褶厚度(mm)
-
2 小时血清胰岛素 (mu U/ml)
-
体重指数(体重公斤/(身高米)^2)
-
糖尿病谱系函数
-
年龄(岁)
输出变量 (y):
- 类变量(0 或 1)
一旦将 CSV 文件加载到内存中,我们就可以将数据列拆分为输入和输出变量。
数据将存储在二维数组中,其中第一个维度是行,第二个维度是列,例如 [行,列]。
我们可以通过使用标准 NumPy切片运算符或“:”选择列的子集将数组拆分为两个数组,我们可以通过切片 0:8 选择从索引 0 到索引 7 的前 8 列。然后我们可以通过索引 8 选择输出列(第 9 个变量)。
... # load the dataset dataset = loadtxt('pima-indians-diabetes.csv', delimiter=',') # split into input (X) and output (y) variables X = dataset[:,0:8] y = dataset[:,8] ... |
我们现在准备定义我们的神经网络模型。
注意,数据集有 9 列,范围 0:8 将选择从 0 到 7 的列,在索引 8 之前停止。如果这对您来说是新的,那么您可以在这篇文章中了解有关数组切片和范围的更多信息:
- 如何在 Python 中为机器学习索引、切片和重塑 NumPy 数组
2. 定义 Keras 模型
Keras 中的模型被定义为一系列层。
我们创建了一个_Sequential 模型_并一次添加一层,直到我们对我们的网络架构感到满意为止。
正确的第一件事是确保输入层具有正确数量的输入特征。这可以在使用input_dim参数创建第一层并将其设置为 8 的 8 个输入变量时指定。
我们如何知道层的数量及其类型?
这是一个非常难的问题。我们可以使用一些启发式方法,通常最好的网络结构是通过反复试验的过程找到的(我在此处对此进行了更多解释)。通常,您需要一个足够大的网络来捕获问题的结构。
在这个例子中,我们将使用一个具有三层的全连接网络结构。
全连接层使用Dense 类定义。我们可以指定层中神经元或节点的数量作为第一个参数,并使用activation参数指定激活函数。
我们将在前两层使用称为 ReLU的整流线性单元激活函数,在输出层使用 Sigmoid 函数。
过去,所有层都首选 Sigmoid 和 Tanh 激活函数。现在,使用 ReLU 激活函数可以获得更好的性能。我们在输出层使用 sigmoid 以确保我们的网络输出介于 0 和 1 之间,并且可以轻松映射到类别 1 的概率或使用默认阈值 0.5 捕捉到任一类别的硬分类。
我们可以通过添加每一层将它们拼凑在一起:
-
该模型需要具有 8 个变量的数据行(_input_dim=8_参数)
-
第一个隐藏层有 12 个节点,使用 relu 激活函数。
-
第二个隐藏层有8个节点,使用relu激活函数。
-
输出层有一个节点,使用sigmoid激活函数。
... # define the keras model model = Sequential() model.add(Dense(12, input_dim=8, activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='sigmoid')) ... |
注意,这里最令人困惑的是模型输入的形状被定义为第一个隐藏层的参数。这意味着添加第一个 Dense 层的代码行做了两件事,定义输入或可见层和第一个隐藏层。
3.编译Keras模型
现在模型已定义,我们可以编译它。
编译模型使用了有效的数字库(所谓的后端),例如 Theano 或 TensorFlow。后端会自动选择表示网络的最佳方式,用于训练和预测以在您的硬件(例如 CPU 或 GPU 甚至分布式)上运行。
编译时,我们必须指定训练网络时所需的一些附加属性。请记住,训练网络意味着找到最佳权重集以将输入映射到我们数据集中的输出。
我们必须指定用于评估一组权重的损失函数,优化器用于搜索网络的不同权重以及我们希望在训练期间收集和报告的任何可选指标。
在这种情况下,我们将使用交叉熵作为损失参数。这种损失是针对二元分类问题的,在 Keras 中被定义为“ binary_crossentropy ”。您可以在此处了解有关根据您的问题选择损失函数的更多信息:
- 训练深度学习神经网络时如何选择损失函数
我们将优化器定义为高效的随机梯度下降算法“ adam ”。这是梯度下降的流行版本,因为它会自动调整自身并在广泛的问题中给出良好的结果。要了解有关 Adam 版本的随机梯度下降的更多信息,请参阅帖子:
- 深度学习的 Adam 优化算法简介
最后,因为这是一个分类问题,我们将收集并报告通过度量参数定义的分类准确度。
... # compile the keras model model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) ... |
4. 拟合 Keras 模型
我们已经定义了我们的模型并编译它准备进行高效计算。
现在是对一些数据执行模型的时候了。
我们可以通过调用模型上的**fit()**函数在加载的数据上训练或拟合模型。
训练发生在 epoch 上,每个 epoch 被分成批次。
-
Epoch:一次遍历训练数据集中的所有行。
-
Batch:在更新权重之前,模型在一个时期内考虑的一个或多个样本。
一个时期由一个或多个批次组成,基于所选的批次大小,并且该模型适用于多个时期。有关 epochs 和 batches 之间差异的更多信息,请参阅帖子:
- 神经网络中的批处理和纪元有什么区别?
训练过程将通过称为 epochs 的数据集运行固定次数的迭代,我们必须使用epochs参数指定。我们还必须设置在每个时期内更新模型权重之前考虑的数据集行数,称为批大小,并使用batch_size参数进行设置。
对于这个问题,我们将运行少量时期(150)并使用相对较小的批次大小 10。
这些配置可以通过反复试验通过实验来选择。我们希望对模型进行足够的训练,以便它学习到输入数据行到输出分类的良好(或足够好)映射。模型总会有一些错误,但对于给定的模型配置,错误量会在某个时间点后趋于平稳。这称为模型收敛。
... # fit the keras model on the dataset model.fit(X, y, epochs=150, batch_size=10) ... |
这是在您的 CPU 或 GPU 上进行工作的地方。
此示例不需要 GPU,但如果您对如何在云中廉价地在 GPU 硬件上运行大型模型感兴趣,请参阅此帖子:
- 如何设置 Amazon AWS EC2 GPU 来训练 Keras 深度学习模型
5. 评估 Keras 模型
我们已经在整个数据集上训练了我们的神经网络,我们可以在同一数据集上评估网络的性能。
这只会让我们了解我们对数据集建模的程度(例如训练准确性),但不知道算法在新数据上的表现如何。我们这样做是为了简单起见,但理想情况下,您可以将数据分成训练和测试数据集,用于训练和评估模型。
您可以使用模型上的evaluate()函数在训练数据集上评估模型,并将用于训练模型的相同输入和输出传递给它。
这将为每个输入和输出对生成预测并收集分数,包括平均损失和您配置的任何指标,例如准确性。
该**评估()**函数将返回两个值的列表。第一个是模型在数据集上的损失,第二个是模型在数据集上的准确性。我们只对报告准确性感兴趣,因此我们将忽略损失值。
... # evaluate the keras model _, accuracy = model.evaluate(X, y) print('Accuracy: %.2f' % (accuracy*100)) |
6. 把它们绑在一起
您刚刚看到了如何在 Keras 中轻松创建您的第一个神经网络模型。
让我们将它们组合成一个完整的代码示例。
# first neural network with keras tutorial
from numpy import loadtxt
from keras.models import Sequential
from keras.layers import Dense
# load the dataset
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=',')
# split into input (X) and output (y) variables
X = dataset[:,0:8]
y = dataset[:,8]
# define the keras model
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# compile the keras model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit the keras model on the dataset
model.fit(X, y, epochs=150, batch_size=10)
# evaluate the keras model
_, accuracy = model.evaluate(X, y)
print('Accuracy: %.2f' % (accuracy*100))
您可以将所有代码复制到 Python 文件中,并将其另存为“ keras_first_network.py ”,与数据文件“ pima-indians-diabetes.csv ”位于同一目录中。然后,您可以从命令行(命令提示符)将 Python 文件作为脚本运行,如下所示:
python keras_first_network.py |
运行此示例,您应该看到 150 个 epoch 中的每个 epoch 打印损失和准确度的消息,然后是在训练数据集上对训练模型的最终评估。
在我的 CPU 上运行的工作站上执行大约需要 10 秒。
理想情况下,我们希望损失为零,准确度为 1.0(例如 100%)。这对于最微不足道的机器学习问题是不可能的。相反,我们的模型中总会有一些错误。目标是选择一个模型配置和训练配置,以实现给定数据集的最低损失和最高准确度。
... 768/768 [==============================] - 0s 63us/step - loss: 0.4817 - acc: 0.7708 Epoch 147/150 768/768 [==============================] - 0s 63us/step - loss: 0.4764 - acc: 0.7747 Epoch 148/150 768/768 [==============================] - 0s 63us/step - loss: 0.4737 - acc: 0.7682 Epoch 149/150 768/768 [==============================] - 0s 64us/step - loss: 0.4730 - acc: 0.7747 Epoch 150/150 768/768 [==============================] - 0s 63us/step - loss: 0.4754 - acc: 0.7799 768/768 [==============================] - 0s 38us/step Accuracy: 76.56 |
**请注意,**如果您尝试在 IPython 或 Jupyter 笔记本中运行此示例,您可能会收到错误消息。
原因是训练期间的输出进度条。您可以通过在调用fit()和evaluate()函数时设置verbose=0轻松关闭这些功能,例如:
... # fit the keras model on the dataset without progress bars model.fit(X, y, epochs=150, batch_size=10, verbose=0) # evaluate the keras model _, accuracy = model.evaluate(X, y, verbose=0) ... |
注意:您的结果可能会因算法或评估程序的随机性或数值精度的差异而有所不同。考虑多次运行该示例并比较平均结果。
你得了多少分?
在下面的评论中发布您的结果。
神经网络是一种随机算法,这意味着每次运行代码时,相同数据上的相同算法可以训练具有不同技能的不同模型。这是一个功能,而不是一个错误。您可以在帖子中了解有关此内容的更多信息:
- 在机器学习中拥抱随机性
模型性能的差异意味着要获得模型性能的合理近似值,您可能需要多次拟合并计算准确度分数的平均值。有关这种评估神经网络的方法的更多信息,请参阅帖子:
- 如何评估深度学习模型的技能
例如,以下是重新运行示例 5 次的准确度分数:
Accuracy: 75.00 Accuracy: 77.73 Accuracy: 77.60 Accuracy: 78.12 Accuracy: 76.17 |
我们可以看到所有的准确度分数都在 77% 左右,平均值为 76.924%。
7. 做出预测
我被问到的第一个问题是:
训练模型后,如何使用它对新数据进行预测?
很好的问题。
我们可以调整上面的例子并使用它来生成对训练数据集的预测,假装它是一个我们以前从未见过的新数据集。
进行预测就像在模型上调用**predict()**函数一样简单。我们在输出层使用 sigmoid 激活函数,因此预测将是 0 到 1 范围内的概率。我们可以通过四舍五入轻松地将它们转换为该分类任务的清晰二元预测。
例如:
... # make probability predictions with the model predictions = model.predict(X) # round predictions rounded = [round(x[0]) for x in predictions] |
或者,我们可以在模型上调用**predict_classes()**函数来直接预测清晰的类,例如:
... # make class predictions with the model predictions = model.predict_classes(X) |
下面的完整示例对数据集中的每个示例进行预测,然后打印数据集中前 5 个示例的输入数据、预测类别和预期类别。
# first neural network with keras make predictions
from numpy import loadtxt
from keras.models import Sequential
from keras.layers import Dense
# load the dataset
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=',')
# split into input (X) and output (y) variables
X = dataset[:,0:8]
y = dataset[:,8]
# define the keras model
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# compile the keras model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit the keras model on the dataset
model.fit(X, y, epochs=150, batch_size=10, verbose=0)
# make class predictions with the model
predictions = model.predict_classes(X)
# summarize the first 5 cases
for i in range(5):
print('%s => %d (expected %d)' % (X[i].tolist(), predictions[i], y[i]))
运行示例不会像以前那样显示进度条,因为我们将详细参数设置为 0。
模型拟合后,对数据集中的所有示例进行预测,并打印前 5 个示例的输入行和预测类值,并与预期类值进行比较。
我们可以看到大多数行都被正确预测。事实上,根据我们在上一节中估计的模型性能,我们预计大约 76.9% 的行会被正确预测。
[6.0, 148.0, 72.0, 35.0, 0.0, 33.6, 0.627, 50.0] => 0 (expected 1) [1.0, 85.0, 66.0, 29.0, 0.0, 26.6, 0.351, 31.0] => 0 (expected 0) [8.0, 183.0, 64.0, 0.0, 0.0, 23.3, 0.672, 32.0] => 1 (expected 1) [1.0, 89.0, 66.0, 23.0, 94.0, 28.1, 0.167, 21.0] => 0 (expected 0) [0.0, 137.0, 40.0, 35.0, 168.0, 43.1, 2.288, 33.0] => 1 (expected 1) |
如果您想了解有关如何使用 Keras 模型进行预测的更多信息,请参阅帖子:
- 如何使用 Keras 进行预测
Keras 教程总结
在本文中,您了解了如何使用强大的 Keras Python 库来创建您的第一个神经网络模型以进行深度学习。
具体来说,您学习了使用 Keras 创建神经网络或深度学习模型的六个关键步骤,包括:
-
如何加载数据。
-
如何在 Keras 中定义神经网络。
-
如何使用高效的数值后端编译 Keras 模型。
-
如何在数据上训练模型。
-
如何在数据上评估模型。
-
如何使用模型进行预测。
Keras 教程扩展
干得好,您已经使用 Python 中的 Keras 深度学习库成功开发了您的第一个神经网络。
本节提供了您可能想要探索的本教程的一些扩展。
-
**调整模型。**更改模型的配置或训练过程,看看是否可以提高模型的性能,例如达到 76% 以上的准确率。
-
保存模型。更新教程以将模型保存到文件,然后稍后加载并使用它进行预测(请参阅本教程)。
-
总结模型。更新教程以总结模型并创建模型层图(请参阅本教程)。
-
单独的训练和测试数据集。将加载的数据集拆分为训练集和测试集(基于行拆分),并使用一组来训练模型,另一组来估计模型在新数据上的性能。
-
绘制学习曲线。fit() 函数返回一个历史对象,该对象总结了每个 epoch 结束时的损失和准确度。创建此数据的线图,称为学习曲线(请参阅本教程)。
-
学习一个新的数据集。更新教程以使用不同的表格数据集,可能来自UCI 机器学习存储库。
-
使用函数式 API。更新教程以使用 Keras Functional API 来定义模型(请参阅本教程)。
Python数据分析与机器学习项目实战 :https://edu.csdn.net/combo/detail/1928
版权声明:文章来自公众号(python风控模型),未经许可,不得抄袭。遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。