原文链接:http://tecdat.cn/?p=15826
深度学习的预测建模是现代开发人员需要了解的一项技能。
TensorFlow是Google开发和维护的首要的开源深度学习框架。尽管直接使用TensorFlow可能具有挑战性,但现代的tf.keras API使得Keras在TensorFlow项目中的使用简单易用。
使用tf.keras,您可以设计,拟合,评估和使用深度学习模型,从而仅用几行代码即可做出预测。它使普通的深度学习任务(如分类和回归预测建模)可供希望完成任务的普通开发人员使用。
在本教程中,您将找到使用tf.keras API在TensorFlow中开发深度学习模型的分步指南。
完成本教程后,您将知道:
- Keras和tf.keras之间的区别以及如何安装和确认TensorFlow是否有效。
- tf.keras模型的5个步骤的生命周期以及如何使用顺序和功能性API。
- 如何使用tf.keras开发MLP,CNN和RNN模型以进行回归,分类和时间序列预测。
- 如何使用tf.keras API的高级功能来检查和诊断模型。
- 如何通过减少过度拟合和加速训练来提高tf.keras模型的性能。
这些例子很小。您可以在大约60分钟内完成本教程。
TensorFlow教程概述
本教程旨在为您的深度学习项目提供tf.keras的完整介绍。
重点是将API用于常见的深度学习模型开发任务;我们不会深入研究深度学习的数学和理论。
学习python深度学习的最好方法是边做边做。
我设计了每个代码示例,以使用最佳实践并使其独立,以便您可以将其直接复制并粘贴到您的项目中,并使其适应您的特定需求。
教程分为五个部分。他们是:
- 安装TensorFlow和tf.keras
- 什么是Keras和tf.keras?
- 如何安装TensorFlow
- 如何确认TensorFlow已安装
- 深度学习模型生命周期
- 五步模型生命周期
- 顺序模型API(简单)
- 功能模型API(高级)
- 如何开发深度学习模型
- 开发多层感知器模型
- 开发卷积神经网络模型
- 开发递归神经网络模型
- 如何使用高级模型功能
- 如何可视化深度学习模型
- 如何绘制模型学习曲线
- 如何保存和加载模型
- 如何获得更好的模型性能
- 如何减少辍学过度拟合
- 如何通过批量归一化来加速培训
- 如何在适当的时间停止训练并尽早停止
您可以使用Python进行深度学习
按照您自己的进度完成本教程。
您不需要了解所有内容。您的目标是端到端地完成本教程并获得结果。您无需在第一遍就了解所有内容。列出您要提出的问题。
您不需要先了解数学。数学是描述算法工作方式的一种紧凑方式,特别是线性代数,概率和统计的工具。这些并不是您可以用来学习算法工作方式的唯一工具。您还可以使用代码并探索具有不同输入和输出的算法行为。了解数学不会告诉您选择哪种算法或如何对其进行最佳配置。
您无需知道算法的工作原理。了解限制以及如何配置深度学习算法非常重要。但是学习算法可能会在以后出现。您需要在很长一段时间内慢慢地建立这种算法知识。
您无需成为Python程序员。如果您是Python语言的新手,它的语法可能很直观。就像其他语言一样,专注于函数调用(例如function())和赋值(例如a =“ b”)。这将为您提供大部分帮助。您是一名开发人员,因此您知道如何真正快速地学习语言的基础知识。刚开始,以后再深入研究细节。
您无需成为深度学习专家。稍后您可以了解各种算法的优点和局限性,并且以后可以阅读大量文章,以深入了解深度学习项目的步骤以及使用交叉验证评估模型技能的重要性。
1.安装TensorFlow和tf.keras
在本节中,您将发现什么是tf.keras,如何安装以及如何确认它已正确安装。
1.1什么是Keras和tf.keras?
Keras是一个用Python编写的开源深度学习库。
该项目由Francois Chollet于2015年启动。它迅速成为开发人员的流行框架,甚至成为最受欢迎的深度学习库之一。
在2015-2019年期间,使用TensorFlow,Theano和PyTorch等数学库开发深度学习模型非常麻烦,需要数十甚至数百行代码才能完成最简单的任务。这些库的重点是研究,灵活性和速度,而不是易用性。
Keras之所以受欢迎是因为该API简洁明了,允许仅用几行代码就可以定义,适配和评估标准的深度学习模型。
在2019年,谷歌发布了他们的TensorFlow深度学习库的新版本(TensorFlow 2),该库直接集成了Keras API,并将该接口提升为平台上深度学习开发的默认或标准接口。
这种集成通常称为tf.keras接口或API(“ tf ”是“ TensorFlow ”的缩写)。这是为了将其与所谓的独立Keras开源项目区分开来。
- 独立的Keras。支持TensorFlow,Theano和CNTK后端的独立开源项目。
- tf.keras。Keras API已集成到TensorFlow 2。
Keras中的Keras API实现被称为“ tf.keras ”,因为这是引用API时使用的Python习惯用法。首先,导入TensorFlow模块并将其命名为“ tf ”;然后,通过调用tf.keras来访问Keras API元素;例如:
代码语言:javascript复制
import tensorflow as tf
model = tf.keras.Sequential()
由于TensorFlow是Keras开源项目的事实上的标准后端,因此集成意味着现在可以使用单个库而不是两个单独的库。此外,独立的Keras项目现在建议所有将来的Keras开发都使用tf.keras API。
目前,我们建议使用TensorFlow后端的多后端Keras的Keras用户在TensorFlow 2.0中切换到tf.keras。tf.keras得到更好的维护,并与TensorFlow功能具有更好的集成。
1.2如何安装TensorFlow
在安装TensorFlow之前,请确保已安装Python,例如Python 3.6或更高版本。
如果您没有安装Python,则可以使用Anaconda安装它。
有很多方法可以安装TensorFlow开源深度学习库。
在工作站上安装TensorFlow的最常见,也许也是最简单的方法是使用pip。
例如,在命令行上,您可以输入:
代码语言:javascript复制sudo pip install tensorflow
代码语言:javascript复制本教程中的所有示例都可以在现代CPU上正常工作。如果要为GPU配置TensorFlow,则可以在完成本教程后进行操作。
1.3如何确认已安装TensorFlow
一旦安装了TensorFlow,重要的是确认库已成功安装并且可以开始使用它。
如果TensorFlow未正确安装或在此步骤上引发错误,则以后将无法运行示例。
创建一个名为versions.py的新文件,并将以下代码复制并粘贴到该文件中。
代码语言:javascript复制# 查看版本
import tensorflow
print(tensorflow.__version__)
保存文件,然后打开命令行并将目录更改为保存文件的位置。
然后输入:
代码语言:javascript复制python versions.py
输出版本信息确认TensorFlow已正确安装。
这也向您展示了如何从命令行运行Python脚本。我建议以这种方式从命令行运行所有代码。
如果收到警告消息
有时,当您使用tf.keras API时,可能会看到警告打印。
这可能包括以下消息:您的硬件支持TensorFlow安装未配置为使用的功能。
我的工作站上的一些示例包括:
代码语言:javascript复制Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
XLA service 0x7fde3f2e6180 executing computations on platform Host. Devices:
StreamExecutor device (0): Host, Default Version
这些是信息性消息,不会阻止您执行代码。您现在可以忽略此类型的消息。
既然您知道tf.keras是什么,如何安装TensorFlow以及如何确认您的开发环境正在工作,让我们看看TensorFlow中深度学习模型的生命周期。
2.深度学习模型生命周期
在本部分中,您将发现深度学习模型的生命周期以及可用于定义模型的两个tf.keras API。
2.1五步模型生命周期
模型具有生命周期,这一非常简单的知识为建模数据集和理解tf.keras API提供了基础。
生命周期中的五个步骤如下:
- 定义模型。
- 编译模型。
- 拟合模型。
- 评估模型。
- 作出预测。
让我们依次仔细研究每个步骤。
定义模型
定义模型要求您首先选择所需的模型类型,然后选择体系结构或网络拓扑。
从API的角度来看,这涉及到定义模型的各层,为每个层配置许多节点和激活功能,以及将各层连接在一起成为一个内聚模型。
可以使用Sequential API或Functional API定义模型,我们将在下一部分中进行介绍。
代码语言:javascript复制# 定义模型
model = ...
编译模型
编译模型要求首先选择要优化的损失函数,例如均方误差或交叉熵。
它还要求您选择一种算法来执行优化过程,通常是随机梯度下降。它还可能要求您选择任何性能指标,以在模型训练过程中进行跟踪。
从API的角度来看,这涉及调用函数以使用选定的配置来编译模型,这将准备有效使用已定义的模型所需的适当数据结构。
可以将优化器指定为已知优化器类的字符串,例如,“ sgd ”用于随机梯度下降,或者您可以配置优化器类的实例并使用该实例。
有关受支持的优化器的列表,请参见:
- tf.keras优化器
# compile the model
opt = SGD(learning_rate=0.01, momentum=0.9)
model.compile(optimizer=opt, loss='binary_crossentropy')
三种最常见的损失函数是:
- ' binary_crossentropy '用于二进制分类。
- ' sparse_categorical_crossentropy '用于多类分类。
- “ mse ”(均方误差)进行回归。
model.compile(optimizer='sgd', loss='mse')
有关受支持的损失函数的列表,请参见:
- tf.keras损失函数
指标定义为已知指标函数的字符串列表或要调用以评估预测的函数列表。
有关支持的指标的列表,请参阅:
- tf.keras指标
...
model.compile(optimizer='sgd', loss='binary_crossentropy', metrics=['accuracy'])
拟合模型
拟合模型要求您首先选择训练配置,例如历元数(遍历训练数据集)和批处理大小(历时中用于估计模型误差的样本数)。
训练应用选定的优化算法以最小化选定的损失函数,并使用误差算法的反向传播更新模型。
拟合模型是整个过程中很慢的部分,可能需要几秒钟到几小时到几天不等,具体取决于模型的复杂性,所使用的硬件以及训练数据集的大小。
从API角度来看,这涉及到调用一个函数来执行训练过程。该功能将阻止(不返回),直到训练过程完成。
代码语言:javascript复制...
# 拟合模型
model.fit(X, y, epochs=100, batch_size=32)
在拟合模型时,进度条将总结每个时期的状态和整个培训过程。通过将“ verbose ”参数设置为2,可以将其简化为每个时期的模型性能的简单报告。通过将“ verbose ” 设置为0,可以在训练过程中关闭所有输出。
代码语言:javascript复制...
# 拟合模型
model.fit(X, y, epochs=100, batch_size=32, verbose=0)
评估模型
评估模型需要首先选择用于评估模型的数据集。这应该是训练过程中未使用的数据,以便在对新数据进行预测时,我们可以获得模型性能的无偏估计。
模型评估的速度与您要用于评估的数据量成正比,尽管它比训练要快得多,因为模型没有改变。
从API角度来看,这涉及使用保持数据集调用函数,并获得损失以及可能报告的其他指标。
代码语言:javascript复制...
# 评估模型
loss = model.evaluate(X, y, verbose=0)
做出预测
做出预测是生命周期的最后一步。这就是为什么我们首先要模型的原因。
它要求您具有需要预测的新数据,例如,在没有目标值的情况下。
从API的角度来看,您只需调用一个函数即可对类标签,概率或数值进行预测:无论您将模型设计为要预测什么。
您可能需要保存模型,然后再加载模型以进行预测。在开始使用模型之前,您也可以选择使模型适合所有可用数据。
现在我们已经熟悉了模型的生命周期,让我们看一下使用tf.keras API构建模型的两种主要方法:顺序模型和功能模型。
代码语言:javascript复制...
# 预测
yhat = model.predict(X)
2.2顺序模型API(简单)
顺序模型API是最简单的,也是我推荐的API,尤其是在入门时。
之所以称其为“ 顺序的 ”,是因为它涉及定义一个顺序类,并以线性方式从输入到输出逐层向模型添加图层。
下面的示例定义了一个顺序MLP模型,该模型接受八个输入,一个隐藏层包含10个节点,然后一个输出层包含一个节点以预测数值。
代码语言:javascript复制#使用顺序api定义的模型的示例
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
#定义模型
model = Sequential()
model.add(Dense(10, input_shape=(8,)))
model.add(Dense(1))
请注意,网络的可见层由第一个隐藏层上的“ input_shape ”参数定义。这意味着在上面的示例中,模型期望一个样本的输入为八个数字的向量。
顺序API易于使用,因为在添加所有图层之前一直调用model.add()。
例如,这是一个具有五个隐藏层的深层MLP。
代码语言:javascript复制#使用顺序api定义的模型的示例
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
# 定义模型
model = Sequential()
model.add(Dense(100, input_shape=(8,)))
model.add(Dense(80))
model.add(Dense(30))
model.add(Dense(10))
model.add(Dense(5))
model.add(Dense(1))
2.3模型API(高级)
模型API更复杂,但也更灵活。
它涉及显式地将一层的输出连接到另一层的输入。每个连接均已指定。
首先,必须通过Input类定义输入层,并指定输入样本的形状。定义模型时,必须保留对输入层的引用。
代码语言:javascript复制...
#定义层
x_in = Input(shape=(8,))
接下来,可以通过调用层并传递输入层来将完全连接的层连接到输入。这将返回对该新层中的输出连接的引用。
代码语言:javascript复制...
x = Dense(10)(x_in)
然后,我们可以用相同的方式将其连接到输出层。
代码语言:javascript复制...
x_out = Dense(1)(x)
连接后,我们定义一个Model对象并指定输入和输出层。下面列出了完整的示例。
代码语言:javascript复制#使用功能性API定义的模型的示例
from tensorflow.keras import Model
from tensorflow.keras import Input
from tensorflow.keras.layers import Dense
#定义层
x_in = Input(shape=(8,))
x = Dense(10)(x_in)
x_out = Dense(1)(x)
#定义模型
model = Model(inputs=x_in, outputs=x_out)
这样,它允许进行更复杂的模型设计,例如可能具有多个输入路径(分离向量)的模型和具有多个输出路径(例如单词和数字)的模型。
习惯了该功能的API可能会很有趣。
有关功能性API的更多信息,请参见:
- TensorFlow中的Keras功能API
既然我们熟悉了模型生命周期以及可用于定义模型的两个API,那么让我们来看一下开发一些标准模型。