Keras 中构建神经网络的 5 个步骤

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 本文讲的是Keras 中构建神经网络的 5 个步骤,使用 Keras 创建、评价深度神经网络非常的便捷,不过你需要严格地遵循几个步骤来构建模型。
本文讲的是Keras 中构建神经网络的 5 个步骤,

Keras 中构建神经网络的 5 个步骤

使用 Keras 创建、评价深度神经网络非常的便捷,不过你需要严格地遵循几个步骤来构建模型。

在本文中我们将一步步地探索在 Keras 中创建、训练、评价深度神经网络,并了解如何使用训练好的模型进行预测。

在阅读完本文后你将了解:

  • 如何在 Keras 中定义、编译、训练以及评价一个深度神经网络。
  • 如何选择、使用默认的模型解决回归、分类预测问题。
  • 如何使用 Keras 开发并运行你的第一个多层感知机网络。

  • 2017 年 3 月更新:将示例更新至 Keras 2.0.2 / TensorFlow 1.0.1 / Theano 0.9.0。

Keras 中构建神经网络的 5 个步骤Keras 中构建神经网络的 5 个步骤

题图版权由 Martin Stitchener 所有。

综述

下面概括一下我们将要介绍的在 Keras 中构建神经网络模型的 5 个步骤。

  1. 定义网络。
  2. 编译网络。
  3. 训练网络。
  4. 评价网络。
  5. 进行预测。

Keras 中构建神经网络的 5 个步骤Keras 中构建神经网络的 5 个步骤

Keras 中构建神经网络的 5 个步骤

想要了解更多使用 Python 进行深度学习的知识?

免费订阅 2 周,收取我的邮件,探索 MLP、CNN 以及 LSTM 吧!(附带样例代码)

现在点击注册还能得到免费的 PDF 版教程。

点击这里开始你的小课程吧!

第一步:定义网络

首先要做的就是定义你的神经网络。

在 Keras 中,可以通过一系列的层来定义神经网络。这些层的容器就是 Sequential 类。(译注:序贯模型)

第一步要做的就是创建 Sequential 类的实例。然后你就可以按照层的连接顺序创建你所需要的网络层了。

例如,我们可以做如下两步:

model = Sequential()
model.add(Dense(2))

此外,我们也可以通过创建一个层的数组,并将其传给 Sequential 构造器来定义模型。

layers = [Dense(2)]
model = Sequential(layers)

网络的第一层必须要定义预期输入维数。指定这个参数的方式有许多种,取决于要建造的模型种类,不过在本文的多层感知机模型中我们将通过 input_dim 属性来指定它。

例如,我们要定义一个小型的多层感知机模型,这个模型在可见层中具有 2 个输入,在隐藏层中有 5 个神经元,在输出层中有 1 个神经元。这个模型可以定义如下:

model = Sequential()
model.add(Dense(5, input_dim=2))
model.add(Dense(1))

你可以将这个序贯模型看成一个管道,从一头喂入数据,从另一头得到预测。

这种将通常互相连接的层分开,并作为单独的层加入模型是 Keras 中一个非常有用的概念,这样可以清晰地表明各层在数据从输入到输出的转换过程中起到的职责。例如,可以将用于将各个神经元中信号求和、转换的激活函数单独提取出来,并将这个 Activation 对象同层一样加入 Sequential 模型中。

model = Sequential()
model.add(Dense(5, input_dim=2))
model.add(Activation('relu'))
model.add(Dense(1))
model.add(Activation('sigmoid'))

输出层激活函数的选择尤为重要,它决定了预测值的格式。

例如,以下是一些常用的预测建模问题类型,以及它们可以在输出层使用的结构和标准的激活函数:

  • 回归问题:使用线性的激活函数 “linear”,并使用与与输出数量相匹配的神经元数量。
  • 二分类问题:使用逻辑激活函数 “sigmoid”,在输出层仅设一个神经元。
  • 多分类问题:使用 Softmax 激活函数 “softmax”;假如你使用的是 one-hot 编码的输出格式的话,那么每个输出对应一个神经元。

第二步:编译网络

当我们定义好网络之后,必须要对它进行编译。

编译是一个高效的步骤。它会将我们定义的层序列通过一系列高效的矩阵转换,根据 Keras 的配置转换成能在 GPU 或 CPU 上执行的格式。

你可以将编译过程看成是对你网络的预计算。

无论是要使用优化器方案进行训练,还是从保存的文件中加载一组预训练权重,只要是在定义模型之后都需要编译,因为编译步骤会将你的网络转换为适用于你的硬件的高效结构。此外,进行预测也是如此。

编译步骤需要专门针对你的网络的训练设定一些参数,设定训练网络使用的优化算法 以及用于评价网络通过优化算法最小化结果的损失函数尤为重要。

下面的例子对定义好的用于回归问题的模型进行编译时,指定了随机梯度下降(sgd)优化算法,以及均方差(mse)算是函数。

model.compile(optimizer='sgd', loss='mse')

预测建模问题的种类也会限制可以使用的损失函数类型。

例如,下面是几种不同的预测建模类型对应的标准损失函数:

  • 回归问题:均方差误差 “mse”。
  • 二分类问题:对数损失(也称为交叉熵)“_binarycrossentropy”。
  • 多分类问题:多类对数损失 “_categoricalcrossentropy”。

你可以查阅 Keras 支持的损失函数

最常用的优化算法是随机梯度下降,不过 Keras 也支持其它的一些优化算法

以下几种优化算法可能是最常用的优化算法,因为它们的性能一般都很好:

  • 随机梯度下降 “sgd” 需要对学习率以及动量参数进行调参。
  • ADAM “adam” 需要对学习率进行调参。
  • RMSprop “rmsprop” 需要对学习率进行调参。

最后,你还可以指定在训练模型过程中除了损失函数值之外的特定指标。一般对于分类问题来说,最常收集的指标就是准确率。需要收集的指标由设定数组中的名称决定。

例如:

model.compile(optimizer='sgd', loss='mse', metrics=['accuracy'])

第三步:训练网络

在网络编译完成后,就能对它进行训练了。这个过程也可以看成是调整权重以拟合训练数据集。

训练网络需要制定训练数据,包括输入矩阵 X 以及相对应的输出 y。

在此步骤,将使用反向传播算法对网络进行训练,并使用在编译时制定的优化算法以及损失函数来进行优化。

反向传播算法需要指定训练的 Epoch(回合数、历元数)、对数据集的 exposure 数。

每个 epoch 都可以被划分成多组数据输入输出对,它们也称为 batch(批次大小)。batch 设定的数字将会定义在每个 epoch 中更新权重之前输入输出对的数量。这种做法也是一种优化效率的方式,可以确保不会同时加载过多的输入输出对到内存(显存)中。

以下是一个最简单的训练网络的例子:

model.compile(optimizer='sgd', loss='mse', metrics=['accuracy'])

在训练网络之后,会返回一个历史对象(History oject),其中包括了模型在训练中各项性能的摘要(包括每轮的损失函数值及在编译时制定收集的指标)。

第四步:评价网络

在网络训练完毕之后,就可以对其进行评价。

可以使用训练集的数据对网络进行评价,但这种做法得到的指标对于将网络进行预测并没有什么用。因为在训练时网络已经“看”到了这些数据。

因此我们可以使用之前没有“看”到的额外数据集来评估网络性能。这将提供网络在未来对没有见过的数据进行预测的性能时的估测。

评价模型将会评价所有测试集中的输入输出对的损失值,以及在模型编译时指定的其它指标(例如分类准确率)。本步骤将返回一组评价指标结果。

例如,一个在编译时使用准确率作为指标的模型可以在新数据集上进行评价,如下所示:

loss, accuracy = model.evaluate(X, y)

第五步:进行预测

最后,如果我们对训练后的模型的性能满意的话,就能用它来对新的数据做预测了。

这一步非常简单,直接在模型上调用 predict() 函数,传入一组新的输入即可。

例如:

predictions = model.predict(x)

预测值将以网络输出层定义的格式返回。

在回归问题中,这些由线性激活函数得到的预测值可能直接就符合问题需要的格式。

对于二分类问题,预测值可能是一组概率值,这些概率说明了数据分到第一类的可能性。可以通过四舍五入(K.round)将这些概率值转换成 0 与 1。

而对于多分类问题,得到的结果可能也是一组概率值(假设输出变量用的是 one-hot 编码方式),因此它还需要用 argmax 函数将这些概率数组转换为所需要的单一类输出。

End-to-End Worked Example

让我们用一个小例子将以上的所有内容结合起来。

我们将以 Pima Indians 糖尿病发病二分类问题为例。你可以在 UCI 机器学习仓库中下载此数据集。

该问题有 8 个输入变量,需要输出 0 或 1 的分类值。

我们将构建一个包含 8 个输入的可见层、12 个神经元的隐藏层、rectifier 激活函数、1 个神经元的输出层、sigmoid 激活函数的多层感知机神经网络。

我们将对网络进行 100 epoch 次训练,batch 大小设为 10,使用 ADAM 优化算法以及对数损失函数。

在训练之后,我们使用训练数据对模型进行评价,然后使用训练数据对模型进行单独的预测。这么做是为了方便起见,一般来说我们都会使用额外的测试数据集进行评价,用新的数据进行预测。

完整代码如下:

# 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))

运行样例,会得到以下输出:

...
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 的神经网络模型还有别的问题吗?或者你对本文还有什么建议吗?请在评论中留言,我会尽力回答。






原文发布时间为:2017年10月16日

本文来自云栖社区合作伙伴掘金,了解相关信息可以关注掘金网站。
相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
2天前
|
SQL 安全 网络安全
构建安全防线:云计算环境中的网络安全策略与实践
【5月更文挑战第14天】 随着企业逐渐将关键业务流程迁移到云端,云计算服务的安全性成为不容忽视的重要议题。本文深入探讨了在动态且复杂的云环境中实施有效的网络安全措施的策略和技术。通过分析当前云计算模型中的安全挑战,我们提出了一系列创新的安全框架和防御机制,旨在保护数据完整性、确保业务连续性并抵御不断演变的网络威胁。文中不仅涵盖了理论分析和案例研究,还对未来云计算安全技术的发展趋势进行了预测。
|
2天前
|
域名解析 网络协议 网络虚拟化
【计算机网络】—— 中小型网络构建与配置
【计算机网络】—— 中小型网络构建与配置
6 0
|
2天前
|
SQL 安全 算法
数字堡垒的构建者:网络安全与信息安全的深层剖析
【5月更文挑战第12天】在信息技术迅猛发展的今天,网络空间已成为信息交流的重要平台。然而,随之而来的是各种网络安全漏洞和威胁的增多。本文深入探讨了网络安全漏洞的类型、成因以及预防措施,并详细分析了加密技术在保障信息安全中的应用。文章还强调了提升个人和企业安全意识的重要性,并分享了如何通过教育和培训来增强这一意识。通过对这些关键方面的知识分享,旨在为读者提供一个全面的网络安全与信息安全视角。
|
2天前
|
机器学习/深度学习 人工智能 算法
构建未来:AI驱动的自适应网络安全防御系统
【5月更文挑战第11天】在数字时代的风口浪尖,网络安全问题日益凸显。传统的安全防御手段在应对不断进化的网络威胁时显得力不从心。本文提出了一个基于人工智能技术的自适应网络安全防御系统框架,旨在通过实时分析、学习和预测网络行为,自动调整防御策略以抵御未知攻击。系统采用先进的机器学习算法和大数据分析技术,能够在保持高效性能的同时,最小化误报率。文章详细阐述了系统的设计理念、关键技术组件以及预期效果,为网络安全的未来发展方向提供新思路。
|
2天前
|
运维 安全 Linux
深入理解Docker自定义网络:构建高效的容器网络环境
深入理解Docker自定义网络:构建高效的容器网络环境
|
2天前
|
机器学习/深度学习 人工智能 安全
构建未来:AI驱动的自适应网络安全防御系统
【5月更文挑战第8天】 随着网络攻击的不断演变,传统的安全措施已不足以应对日益复杂的威胁。本文提出了一种基于人工智能(AI)的自适应网络安全防御系统,旨在通过实时分析网络流量和行为模式来自动调整安全策略。系统利用深度学习算法识别潜在威胁,并通过强化学习优化防御机制。初步实验表明,该系统能够有效提高检测率,减少误报,并在未知攻击面前展现出较强的适应性。
22 1
|
2天前
|
安全 数据安全/隐私保护 网络协议
【题目】【网络系统管理】2022 年全国职业院校技能大赛 网络系统管理赛项 模块 A:网络构建
【题目】【网络系统管理】2022 年全国职业院校技能大赛 网络系统管理赛项 模块 A:网络构建
【题目】【网络系统管理】2022 年全国职业院校技能大赛 网络系统管理赛项 模块 A:网络构建
|
2天前
|
网络协议 安全 数据安全/隐私保护
【题目】【网络系统管理】2022年甘肃省职业院校技能大赛-网络构建-试卷
【题目】【网络系统管理】2022年甘肃省职业院校技能大赛-网络构建-试卷
【题目】【网络系统管理】2022年甘肃省职业院校技能大赛-网络构建-试卷
|
2天前
|
数据采集 自然语言处理 算法
疾病关联网络构建及并发症预测模型
疾病关联网络构建及并发症预测模型
|
2天前
|
SQL 安全 网络安全
网络堡垒的构建者:深入网络安全与信息保护
【5月更文挑战第6天】 在数字化浪潮不断推进的今天,网络安全和信息安全成为了维护个人隐私、企业商业秘密和国家安全的重要议题。本文将探讨网络安全中的漏洞问题、加密技术的进展以及提升安全意识的必要性。通过分析当前网络攻击手段的复杂性,我们揭示了安全漏洞产生的原因及其对系统安全的潜在威胁。同时,文章还将介绍最新的加密技术如何为数据传输提供强有力的保护,并讨论如何通过培训和教育来增强用户的安全意识,以形成更为坚固的网络防线。

热门文章

最新文章