【翻译自 :  Your First Deep Learning Project in Python with Keras Step-By-Step 】

【说明:Jason Brownlee PhD大神的文章个人很喜欢,所以闲暇时间里会做一点翻译和学习实践的工作,这里是相应工作的实践记录,希望能帮到有需要的人!】

Keras 是一个功能强大且易于使用的免费开源 Python 库,用于开发和评估深度学习模型。

它封装了高效的数值计算库 Theano 和 TensorFlow,让您只需几行代码即可定义和训练神经网络模型。在本教程中,您将了解如何使用 Keras 在 Python 中创建您的第一个深度学习神经网络模型。

Keras 教程概述

不需要很多代码,但我们会慢慢地使用它,以便您将来知道如何创建自己的模型。

您将在本教程中介绍的步骤如下:

加载数据。
定义 Keras 模型。
编译 Keras 模型。
适合 Keras 模型。
评估 Keras 模型。
系统整合。
作出预测

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 文件的位置相同。

数据样例如下:

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]
...

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'))
...

3.编译Keras模型

现在模型已定义,我们可以编译它。编译模型使用了有效的数字库(所谓的后端),例如 Theano 或 TensorFlow。后端会自动选择表示网络的最佳方式,用于训练和预测以在您的硬件(例如 CPU 或 GPU 甚至分布式)上运行。

编译时,我们必须指定训练网络时所需的一些附加属性。请记住,训练网络意味着找到最佳权重集以将输入映射到我们数据集中的输出。

我们必须指定用于评估一组权重的损失函数,优化器用于搜索网络的不同权重以及我们希望在训练期间收集和报告的任何可选指标。在这种情况下,我们将使用交叉熵作为损失参数。这种损失是针对二元分类问题的,在 Keras 中被定义为“binary_crossentropy”。您可以在此处了解有关根据您的问题选择损失函数的更多信息:

训练深度学习神经网络时如何选择损失函数:我们将优化器定义为高效的随机梯度下降算法“adam”。这是梯度下降的流行版本,因为它会自动调整自身并在广泛的问题中给出良好的结果。

最后,因为这是一个分类问题,我们将收集并报告通过度量参数定义的分类准确度。

...
# compile the keras model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
...

4. 拟合 Keras 模型

我们已经定义了我们的模型并编译它准备进行高效计算。现在是对一些数据执行模型的时候了。我们可以通过调用模型上的 fit() 函数在加载的数据上训练或拟合模型。

训练发生在 epoch 上,每个 epoch 被分成批次。

epoch:一次遍历训练数据集中的所有行。
batch:在更新权重之前,模型在一个时期内考虑的一个或多个样本。
一个时期由一个或多个批次组成,基于所选的批次大小,并且该模型适用于多个时期。

神经网络中的批处理和epoch有什么区别?
        训练过程将通过称为 epochs 的数据集运行固定次数的迭代,我们必须使用 epochs 参数指定。我们还必须设置在每个时期内更新模型权重之前考虑的数据集行数,称为批大小,并使用 batch_size 参数进行设置。

对于这个问题,我们将运行少量时期(150)并使用相对较小的批次大小 10。

这些配置可以通过反复试验通过实验来选择。我们希望对模型进行足够的训练,以便它学习到输入数据行到输出分类的良好(或足够好)映射。模型总会有一些错误,但对于给定的模型配置,错误量会在某个时间点后趋于平稳。这称为模型收敛。

...
# fit the keras model on the dataset
model.fit(X, y, epochs=150, batch_size=10)
...

5. 评估 Keras 模型

我们已经在整个数据集上训练了我们的神经网络,我们可以在同一数据集上评估网络的性能。这只会让我们了解我们对数据集建模的程度(例如训练准确性),但不知道算法在新数据上的表现如何。我们这样做是为了简单起见,但理想情况下,您可以将数据分成训练和测试数据集,用于训练和评估模型。您可以使用模型上的evaluate() 函数在训练数据集上评估模型,并将用于训练模型的相同输入和输出传递给它。这将为每个输入和输出对生成预测并收集分数,包括平均损失和您配置的任何指标,例如准确性。

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

运行此示例,您应该看到 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

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]

或者,我们可以将概率转换为 0 或 1 以直接预测清晰的类别,例如:

...
# make class predictions with the model
predictions = (model.predict(X) > 0.5).astype(int)

下面的完整示例对数据集中的每个示例进行预测,然后打印数据集中前 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(X) > 0.5).astype(int)
# 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基础项目实践相关推荐

  1. Python基础项目实践之:学生信息管理系统

    Python课堂基础实践系列: Python基础项目实践之:学生信息管理系统 python基础项目实践之: 学生通讯录管理系统 Python基础项目实践之:面向对象方法模拟简单计算器 Python基础 ...

  2. python基础项目实践之: 学生通讯录管理系统

    Python课堂基础实践系列: Python基础项目实践之:学生信息管理系统 python基础项目实践之: 学生通讯录管理系统 Python基础项目实践之:面向对象方法模拟简单计算器 Python基础 ...

  3. Python基础项目实践之:面向对象方法模拟简单计算器

    Python课堂基础实践系列: Python基础项目实践之:学生信息管理系统 python基础项目实践之: 学生通讯录管理系统 Python基础项目实践之:面向对象方法模拟简单计算器 Python基础 ...

  4. Python基础项目实践之:面向对象方法实现模拟银行管理系统

    Python课堂基础实践系列: Python基础项目实践之:学生信息管理系统 python基础项目实践之: 学生通讯录管理系统 Python基础项目实践之:面向对象方法模拟简单计算器 Python基础 ...

  5. MySQL 8.0 初学与基础项目实践

    本文主要参考 <SQL必知必会(第四版)> 以及**MySQL 8.0 Reference Manual** 不再更新 --Last update: 2019/05/07:更新项目12 欢 ...

  6. 《大数据系统基础》实践项目期末答辩顺利举行 校企联手打造精品实践项目见真章

    近期,由清华大学研究生院和数据科学研究院(以下简称:数据院)共同开设的清华大学大数据能力提升项目<大数据系统基础>实践项目期末答辩在清华大学六号教学楼顺利举行.20位企业导师作为评审参与答 ...

  7. 【机器学习基础】SVM算法在项目实践中的应用!

    作者:苏丽敏,Datawhale优秀学习者,北理工计算机硕士 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本.非线性及高维 ...

  8. Kotlin项目实践指南(上)

    关于作者 郭孝星,程序员,吉他手,主要从事Android平台基础架构方面的工作,欢迎交流技术方面的问题,可以去我的Github提issue或者发邮件至guoxiaoxingse@163.com与我交流 ...

  9. 《精通Unix下C语言与项目实践》读书笔记(16)

    <精通Unix下C语言编程与项目实践>读书笔记(new) 文章试读  不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国.一.二.三.四 职场规划:一些杂七杂八 ...

  10. 项目实践精解:ASP.NET应用开发

    前 言 作者从事软件设计开发工作十多年,最近才萌发了写书的想法.因为作者希望推广一种最有效的学习捷径,这就是Project-Driven Training,也就是用项目实践来带动理论学习的方法.基于此 ...

最新文章

  1. C#用Tesseract进行OCR识别,可识别中英日韩所有语言
  2. [Java 基础]方法
  3. U-Boot 之五 详解 U-Boot 及 SPL 的启动流程
  4. 第1节 连通性强连通、割点和桥 例题
  5. Spark之SparkSQL数据源
  6. 【已解决】抱歉,由于某种原因,PowerPoint 无法加载D:\mathtype\Office Support\64\MathType(PowerPoint 2016).ppam加载项。
  7. Atitit.木马病毒 webftp 的原理跟个设计
  8. Revit PromptForFamilyInstancePlacementOptions 族放置API
  9. MicroPython学习笔记(二)操作GPIO和TIMER实现数码管动态显示
  10. 010editor的破解
  11. word怎么恢复保存前的文件,word文件恢复
  12. 【DG】基于同一个主机建立物理备库和逻辑备库 (三)
  13. Java接口,多态,向上转型,向下转型的意义
  14. HTML5 之 Img 标签
  15. 屏蔽ENTER键、ESC键的使用
  16. “一切皆是映射” (光剑)
  17. 四年级下册计算机工作计划,四年级下册信息技术教学计划
  18. 软件测试难吗?0基础可以学吗?上手时间快吗?如何从零开始学习软件测试?
  19. 【BLE MESH】PB-ADV入网详解
  20. pjsip安卓端编译步骤

热门文章

  1. 距离向量算法与链路状态算法(RIP、OSPF)
  2. SQL Server 和 HSQLDB 中使用 merge into 完成 saveOrUpdate
  3. 算法笔记_101:蓝桥杯练习 算法提高 身份证号码升级(Java)
  4. 第四届中国云计算大会——123
  5. [Linux]不可重入函数
  6. Xamarin.Forms 仿照京东搜索记录控件
  7. Win10系统80端口被系统进程占用
  8. Linux ssh服务开启秘钥和密码认证
  9. Web开发者必备的十大网站资源(转贴)
  10. unity 电梯_unity应用实例——电梯模拟系统