提交 f04b23ca 编写于 作者: W wizardforcel

2021-01-23 20:16:14

上级 fc041ef6
# 1.深度学习和 PyTorch 简介
总览
### 概述
本章介绍了本书的两个主要主题:深度学习和 PyTorch。 在这里,您将能够探索深度学习的一些最受欢迎的应用,了解什么是 PyTorch,并使用 PyTorch 构建单层网络,这将是您将学习应用于现实生活的起点 数据问题。 在本章结束时,您将能够使用 PyTorch 的语法来构建神经网络,这在后续章节中将是必不可少的。
本章介绍了本书的两个主要主题:深度学习和 PyTorch。 在这里,您将能够探索深度学习的一些最受欢迎的应用,了解什么是 PyTorch,并使用 PyTorch 构建单层网络,这将是您将学习应用于现实生活的数据问题的起点。 在本章结束时,您将能够使用 PyTorch 的语法来构建神经网络,这在后续章节中将是必不可少的。
# 简介
......@@ -123,7 +123,7 @@ tensor_1 = torch.tensor([1,1,0,2])
tensor_2 = torch.tensor([[0,0,2,1,2],[1,0,2,2,0]])
```
请注意,前面的代码片段中的数字没有含义。 重要的是不同维度的定义,其中用随机数填充。 根据前面的代码段,第一个张量在一个维度上的大小为 4,而第二张量在两个维度中的每个维度的大小为 5,可以通过使用`shape`进行验证 张量变量的]属性,如下所示:
请注意,前面的代码片段中的数字没有含义。 重要的是不同维度的定义,其中用随机数填充。 根据前面的代码段,第一个张量在一个维度上的大小为 4,而第二张量在两个维度中的每个维度的大小为 5,可以通过验证张量变量的`shape`属性,如下所示:
```py
tensor_1.shape
......@@ -143,7 +143,7 @@ tensor_2.shape
tensor = torch.tensor([1,1,0,2]).cuda
```
使用 PyTorch 张量创建伪数据非常简单,类似于您在 NumPy 中执行的操作。 例如,`torch.randn()`返回一个用括号内指定尺寸的随机数填充的张量,而`torch.randint()`返回一个以整数填充的张量(最小 和最大值可以定义)括号内定义的尺寸:
使用 PyTorch 张量创建伪数据非常简单,类似于您在 NumPy 中执行的操作。 例如,`torch.randn()`返回一个用括号内指定尺寸的随机数填充的张量,而`torch.randint()`返回一个以整数填充的张量(最小和最大值可以定义)括号内定义的尺寸:
注意
......@@ -242,7 +242,7 @@ PyTorch 已被许多研究人员和人工智能开发人员采用,这使其成
* **小型社区**:与其他库(例如 TensorFlow)相比,该库的适配器社区很小。 但是,它仅对公众开放了三年,今天,它已成为实现深度学习解决方案的最受欢迎的前五名图书馆之一,并且它的社区每天都在增长。
* **参差不齐的文档**:与其他深度学习库相比,该库是一个相当新的文档,因此该文档并不完整。 但是,由于库的特性和功能正在增加,因此文档正在扩展。 此外,随着社区的不断发展,互联网上将提供更多信息。
* **有关生产准备就绪的问题**:尽管有关该库的许多投诉都集中在无法将其部署到生产中,但在发布 1.0 版之后,该库包含了可以导出最终版本的生产能力 进行建模并在生产环境中使用它们。
* **有关生产准备就绪的问题**:尽管有关该库的许多投诉都集中在无法将其部署到生产中,但在发布 1.0 版之后,该库包含了生产能力,可以导出最终模型并在生产环境中使用它们。
## PyTorch 的关键元素
......@@ -271,7 +271,7 @@ ab.backward()
接下来,使用两个张量的值定义一个函数。 最后,使用`backward()`函数来计算梯度。
通过打印`a`和`b`的梯度,可以确认仅对第一个变量(`a`)计算梯度,而对第二个梯度进行计算 一个(`b`),则会引发错误:
通过打印`a`和`b`的梯度,可以确认仅对第一个变量(`a`)计算梯度,而对第二个(`b`)计算梯度,则会引发错误:
```py
print(a.grad.data)
......@@ -312,7 +312,7 @@ model = nn.Sequential(nn.Linear(input_units, hidden_units), \
loss_funct = nn.MSELoss()
```
首先,导入模块。 然后,定义模型架构。 `input_units`表示输入数据包含的要素数量,`hidden_​​units`表示隐藏层的节点数量, `output_units`表示 输出层的节点
首先,导入模块。 然后,定义模型架构。 `input_units`表示输入数据包含的要素数量,`hidden_​​units`表示隐藏层的节点数量, `output_units`表示输出层的节点数量
从前面的代码中可以看出,网络的架构包含一个隐藏层,其后是 ReLU 激活函数和一个输出层,然后是一个 Sigmoid 激活函数,从而使其成为两层网络。
......@@ -361,7 +361,7 @@ loss_funct = nn.MSELoss()
print(model)
```
在前面的代码段中显示的 将显示以下输出:
前面的代码段将显示以下输出:
```py
Sequential(
......
......@@ -44,9 +44,9 @@
图 2.1:感知器图
在这里,`X1``X2``X3``X4`代表感知器的不同输入,并且可能存在 其中任何数量。 圆是感知器,在该处处理输入以达到输出。
在这里,`X1``X2``X3``X4`代表感知器的不同输入,并且这些可能是任何数字。 圆是感知器,在该处处理输入以达到输出。
Rosenblatt 还介绍了权重的概念(`w1``w2`,...,`wn`),这些数字表示每个输入的重要性。 输出可以是 0 或 1,并且取决于输入的加权总和是高于还是低于给定阈值(由开发人员设置的数值限制或由数据问题的约束设置),该阈值可以设置为 感知器的参数,如下所示:
Rosenblatt 还介绍了权重的概念(`w1``w2`,...,`wn`),这些数字表示每个输入的重要性。 输出可以是 0 或 1,并且取决于输入的加权总和是高于还是低于给定阈值(由开发人员设置的数值限制或由数据问题的约束设置),该阈值可以设置为感知器的参数,如下所示:
![Figure 2.2: Equation for the output of perceptrons ](img/B15778_02_02.jpg)
......@@ -96,7 +96,7 @@ Rosenblatt 还介绍了权重的概念(`w1`,`w2`,...,`wn`),这些数
## 神经网络的学习过程
一般而言,神经网络由多个神经元组成,其中每个神经元都会计算线性函数以及激活函数,以根据某些输入得出输出(激活函数旨在打破线性关系,这将是 稍后在本章中有更详细的说明)。 该输出与权重相关联,该权重代表其重要性级别,并将在下一层中用于计算。
一般而言,神经网络由多个神经元组成,其中每个神经元都会计算线性函数以及激活函数,以根据某些输入得出输出(激活函数旨在打破线性关系,稍后在本章中有更详细的说明)。 该输出与权重相关联,该权重代表其重要性级别,并将在下一层中用于计算。
而且,这些计算是在整个网络架构中进行的,直到达到最终输出为止。 与地面实况相比,此输出用于确定网络的性能,然后将其用于调整网络的不同参数以重新开始计算过程。
......@@ -108,7 +108,7 @@ Rosenblatt 还介绍了权重的概念(`w1`,`w2`,...,`wn`),这些数
### 正向传播
这是从左到右遍历网络架构的过程,同时使用输入数据执行计算以得出可以与基本事实进行比较的预测。 这意味着网络中的每个神经元都会根据与之关联的权重和偏差来转换输入数据(初始数据或从上一层接收的数据),并将输出发送到下一层,直到最后一层 达到并做出预测。
这是从左到右遍历网络架构的过程,同时使用输入数据执行计算以得出可以与基本事实进行比较的预测。 这意味着网络中的每个神经元都会根据与之关联的权重和偏差来转换输入数据(初始数据或从上一层接收的数据),并将输出发送到下一层,直到达到最后一层并做出预测。
注意
......@@ -194,7 +194,7 @@ Rosenblatt 还介绍了权重的概念(`w1`,`w2`,...,`wn`),这些数
### 反向传播
训练过程的最后一步包括在网络架构中从右向左移动以计算损失函数相对于每一层的权重和偏差的偏导数(也称为梯度),以便更新这些 参数(权重和偏差),以便在下一个迭代步骤中,损失函数较低。
训练过程的最后一步包括在网络架构中从右向左移动以计算损失函数相对于每一层的权重和偏差的偏导数(也称为梯度),以便更新这些参数(权重和偏差),以便在下一个迭代步骤中,损失函数较低。
优化算法的最终目标是找到损失函数达到最小可能值的全局最小值,如下图所示:
......@@ -214,7 +214,7 @@ Rosenblatt 还介绍了权重的概念(`w1`,`w2`,...,`wn`),这些数
### 梯度下降
梯度下降是数据科学家中使用最广泛的优化算法,它是许多其他优化算法的基础。 计算完每个神经元的梯度后,权重和偏差会沿梯度的相反方向更新,应将其乘以学习率(用于控制每次优化中所采取步骤的大小),以下等式。
梯度下降是数据科学家中使用最广泛的优化算法,它是许多其他优化算法的基础。 计算完每个神经元的梯度后,权重和偏差会沿梯度的相反方向更新,应将其乘以学习率(用于控制每次优化中所采取步骤的大小),例如以下等式。
学习率在训练过程中至关重要,因为它防止权重和过冲/下冲偏差的更新,这可能会阻止模型分别收敛或延迟训练过程。
......@@ -274,7 +274,7 @@ Rosenblatt 还介绍了权重的概念(`w1`,`w2`,...,`wn`),这些数
3. **输出层**。这是网络的最后一层,位于网络图示的最右边。它接收网络中所有神经元处理数据后的数据,以做出最终预测。
输出层可以具有一个或多个神经元。 前者是指解决方案是二进制的模型,其形式为 0 或 1s。 另一方面,后一种情况由模型组成,这些模型输出实例属于每个可能的类标签(目标变量具有的可能值)的概率,这意味着该层将具有与类一样多的神经元 标签
输出层可以具有一个或多个神经元。 前者是指解决方案是二进制的模型,其形式为 0 或 1s。 另一方面,后一种情况由模型组成,这些模型输出实例属于每个可能的类标签(目标变量具有的可能值)的概率,这意味着该层将具有与类标签一样多的神经元
![Figure 2.18: Architecture of a neural network with two hidden layers ](img/B15778_02_18.jpg)
......@@ -354,7 +354,7 @@ CNN 创建的模型使用神经元的子组来识别图像的不同方面。 这
## 循环神经网络简介
前述神经网络(ANN 和 CNN)的主要局限性在于,它们只能通过考虑当前事件(正在处理的输入)来学习,而不会考虑先前或后续事件,因此考虑到我们人类并不认为这是不便的 那样。 例如,当阅读一本书时,通过考虑上一段或更多段中的上下文,您可以更好地理解每个句子。
前述神经网络(ANN 和 CNN)的主要局限性在于,它们只能通过考虑当前事件(正在处理的输入)来学习,而不会考虑先前或后续事件,因此考虑到我们人类并不这样思考,这是不便的。 例如,当阅读一本书时,通过考虑上一段或更多段中的上下文,您可以更好地理解每个句子。
因此,并考虑到神经网络旨在优化传统上由人类完成的多个过程这一事实,至关重要的是考虑一个能够考虑输入和输出序列的网络,因此**循环神经网络****RNN**)。 它们是一种强大的神经网络,可以通过使用内部存储器找到复杂数据问题的解决方案。
......@@ -595,7 +595,7 @@ EDA 流程很有用,因为它有助于开发人员发现对于定义操作过
尽管没有对模型进行数据训练,但模型会对模型产生间接影响,这就是为什么不应该对模型进行最终性能评估的原因,因为它可能是有偏差的度量。
* **测试集**:该集对模型没有影响,这就是为什么它用于对看不见的数据进行模型的最终评估的原因,这成为模型在模型上的性能如何的指南 未来的数据集
* **测试集**:该集对模型没有影响,这就是为什么它用于对看不见的数据进行模型的最终评估的原因,这成为模型在未来的数据集上的表现如何的指南
考虑到每个数据问题都是不同的,并且开发深度学习解决方案通常需要反复试验的方法,因此没有理想的科学方法可以将数据分为上述三组。 尽管如此,众所周知,对于较大的数据集(数十万个实例),每个集合的分割比例应为 98:1:1,因为对于训练集使用尽可能多的数据至关重要。 对于较小的数据集,常规拆分比率为 60:20:20。
......@@ -764,7 +764,7 @@ EDA 流程很有用,因为它有助于开发人员发现对于定义操作过
# 构建深度神经网络
一般而言,可以使用 scikit-learn(不适用于深度学习)之类的库在非常简单的级别上构建神经网络,该库可以为您执行所有数学运算而没有很大的灵活性,或者可以在非常复杂的级别上实现 通过从头开始编码训练过程的每个步骤,或使用更强大的框架,可以提供极大的灵活性。
一般而言,可以使用 scikit-learn(不适用于深度学习)之类的库在非常简单的级别上构建神经网络,该库可以为您执行所有数学运算而没有很大的灵活性,或者在非常复杂的级别上,通过从头开始编码训练过程的每个步骤,或使用更强大的框架,可以提供极大的灵活性。
PyTorch 的构建考虑了该领域许多开发人员的意见,其优点是可以将两个近似值放在同一位置。 正如我们前面提到的,它具有一个神经网络模块,该模块被构建为允许使用顺序容器对简单架构进行简单的预定义实现,同时允许创建自定义模块,从而为构建非常复杂的架构的过程引入灵活性 。
......@@ -936,6 +936,6 @@ Ground truth: 1995.0 Prediction: 1998.0279541015625
该过程的最终目标是通过更新网络每个神经元中每个输入值所伴随的权重和偏差来最小化损失函数。 这可以通过迭代过程来实现,该过程可能要花费几分钟,几小时甚至几周的时间,具体取决于数据问题的性质。
还讨论了三种主要类型的神经网络的主要架构:人工神经网络,卷积神经网络和循环神经网络。 第一个用于解决传统的分类或回归问题,第二个由于具有解决计算机视觉问题(例如图像分类)的能力而广受欢迎,第三个可按顺序处理数据,这对于 语言翻译等任务。
还讨论了三种主要类型的神经网络的主要架构:人工神经网络,卷积神经网络和循环神经网络。 第一个用于解决传统的分类或回归问题,第二个由于具有解决计算机视觉问题(例如图像分类)的能力而广受欢迎,第三个可按顺序处理数据,用于语言翻译等任务。
在下一章中,将讨论解决回归问题和分类数据问题之间的主要区别。 您还将学习如何解决分类数据问题,以及如何改善其性能以及如何部署模型。
\ No newline at end of file
# 3.使用 DNN 的分类问题
总览
### 概述
在本章中,我们将看一个银行业中的实际例子,以解决分类数据问题。 您将学习如何利用 PyTorch 的自定义模块来定义网络架构并训练模型。 您还将探索误差分析的概念,以提高模型的性能。 最后,您将研究部署模型的不同方法,以便将来使用它。 到本章结束时,您将对该过程有深刻的了解,以便可以使用**深度神经网络****DNN**)在 PyTorch 中。
......@@ -46,7 +46,7 @@
* **贷款申请评估**:银行根据不同的因素(包括人口统计信息,信用记录等)向客户发放贷款。 他们在此过程中的主要目标是最大程度地减少将拖欠贷款的客户数量(使失败率最小),从而使通过已发行贷款获得的回报最大化。
神经网络用于帮助决定是否授予贷款。 通常使用以前未偿还贷款的贷款人以及按时偿还贷款的人的数据对他们进行训练。 创建模型后,想法是将新申请人的数据输入模型中,以便预测他们是否会偿还贷款,考虑到模型的重点应该是减少虚假的数量 正数(模型预测的客户会拖欠贷款,但实际上没有)。
神经网络用于帮助决定是否授予贷款。 通常使用以前未偿还贷款的贷款人以及按时偿还贷款的人的数据对他们进行训练。 创建模型后,想法是将新申请人的数据输入模型中,以便预测他们是否会偿还贷款,考虑到模型的重点应该是减少假正例的数量(模型预测的客户会拖欠贷款,但实际上没有)。
在行业中,已知神经网络的故障率低于依靠人类专业知识的传统方法。
......@@ -66,7 +66,7 @@
## 探索数据集
在以下各节中,我们将重点关注使用**信用卡客户默认值****DCCC**)数据集解决与信用卡付款有关的分类任务,该数据集先前是从 UC Irvine 下载的 储存库站点
在以下各节中,我们将重点关注使用**信用卡客户默认值****DCCC**)数据集解决与信用卡付款有关的分类任务,该数据集先前是从 UC Irvine 储存库站点下载的
本节的主要思想是清楚说明数据问题的内容,原因和方式,这将有助于确定研究目的和评估指标。 此外,我们将详细分析手头的数据,以识别数据准备过程中所需的一些步骤(例如,将定性特征转换为其数值表示形式)。
......@@ -82,7 +82,7 @@
明确定义问题后,您需要确定最终模型的优先级。 这意味着确定所有输出类别是否同样重要。 例如,建立模型的时候,测量肺部肿块是否恶变的模型应主要集中在使**假负例**最小化(模型预测为无恶性肿块,但实际上是恶性的患者)上。 识别手写字符不应只关注一个特定的字符,而应最大化其在平等地识别所有字符方面的性能。
考虑到这一点以及“意义”语句中的解释,信用卡客户默认**数据集**的模型优先级应该是在不优先考虑任何类别标签的情况下最大化模型的整体性能 。 这主要是因为“为什么”声明宣称研究的主要目的应该是更好地了解银行将要收到的资金,并对可能拖欠付款的客户采取某些措施(针对 例如,提供将债务分成较小的付款),以及针对那些不会违约的人采取不同的行动(例如,提供优惠作为对行为良好的客户的奖励)。
考虑到这一点以及“意义”语句中的解释,信用卡客户默认**数据集**的模型优先级应该是在不优先考虑任何类别标签的情况下最大化模型的整体性能 。 这主要是因为“为什么”声明宣称研究的主要目的应该是更好地了解银行将要收到的资金,并对可能拖欠付款的客户采取某些措施(例如,提供将债务分成较小的付款),以及针对那些不会违约的人采取不同的行动(例如,提供优惠作为对行为良好的客户的奖励)。
据此,本案例研究中使用的性能指标是**准确率**,其重点是使**正确分类的实例**最大化。 这是指任何类别标签正确分类的实例与实例总数的比率。
......@@ -102,7 +102,7 @@
## 数据准备
尽管在这方面有一些良好的做法,但是并没有固定的一组步骤来准备(预处理)数据集以开发深度学习解决方案,并且在大多数情况下,要采取的步骤取决于 现有数据,要使用的算法以及研究的其他特征。
尽管在这方面有一些良好的做法,但是并没有固定的一组步骤来准备(预处理)数据集以开发深度学习解决方案,并且在大多数情况下,要采取的步骤取决于现有数据,要使用的算法以及研究的其他特征。
注意
......@@ -296,7 +296,7 @@ final_data.to_csv("dccc_prepared.csv", index=False)
## 用于分类任务的 ANN
如“活动 2.02”中所示,从“第 2 章”,“神经网络的构建模块”开发用于回归问题的深度学习解决方案,为回归任务而构建的神经网络使用输出作为连续值,这就是为什么在输出层不具有激活函数且仅具有一个输出节点(实际值)的原因,就像在构建用于预测房价的模型的情况下一样 根据房屋和邻里的特征
如“活动 2.02”中所示,从“第 2 章”,“神经网络的构建模块”开发用于回归问题的深度学习解决方案,为回归任务而构建的神经网络使用输出作为连续值,这就是为什么在输出层不具有激活函数且仅具有一个输出节点(实际值)的原因,就像在根据房屋和邻里的特征,构建用于预测房价的模型的情况下一样。
鉴于此,要测量与此类模型相关的性能,您应该计算地面真实值和预测值之间的差,例如,计算 125.3(预测)与 126.38(地面真实值)之间的距离 。 如前所述,有许多方法可以测量此差异,例如**均方误差****MSE**),或另一种变化是**均方根误差****RMSE**),是最常用的指标。
......@@ -330,7 +330,7 @@ final_data.to_csv("dccc_prepared.csv", index=False)
* **输出层**:同样,任何 ANN 仅具有一个输出层。 它包含的单元数取决于要开发的学习任务以及数据问题。 对于回归任务,将只有一个单位,即预测值。 但是,对于分类问题,考虑到模型的输出应该是属于每个类别标签的一组要素的概率,单位数量应等于可用的类别标签的数量。
* **其他参数**:对于网络的第一种配置,其他参数应保留其默认值。 这主要是因为,在考虑可能表现相同或较差但需要更多资源的更复杂的近似值之前,最好先对数据问题进行最简单的模型测试。
一旦定义了初始架构,就该训练和测量模型的性能以进行进一步分析了,这很可能导致网络架构或其他参数值的更改,例如更改 学习率或正则化项的增加
一旦定义了初始架构,就该训练和测量模型的性能以进行进一步分析了,这很可能导致网络架构或其他参数值的更改,例如更改学习率或增加正则化项
## PyTorch 自定义模块
......@@ -434,7 +434,7 @@ class Classifier(torch.nn.Module):
## 定义损失函数并训练模型
重要的是要提到,交叉熵损失函数要求网络的输出是原始的(在通过使用`softmax`激活函数获得概率之前),这就是为什么通常会发现 用于分类问题的神经网络架构,而没有针对输出层的激活函数。 此外,为了通过这种方法进行预测,必须在训练模型后将`softmax`激活函数应用于网络的输出。
重要的是要提到,交叉熵损失函数要求网络的输出是原始的(在通过使用`softmax`激活函数获得概率之前),这就是为什么通常会发现,用于分类问题的神经网络架构,没有针对输出层的激活函数。 此外,为了通过这种方法进行预测,必须在训练模型后将`softmax`激活函数应用于网络的输出。
解决此问题的另一种方法是对输出层使用`log_softmax`激活函数。 这样,损失函数可以定义为负对数似然损失(`nn.NLLLoss`)。 最后,可以通过从网络输出中获取指数来获得属于每个类别标签的一组要素的概率。 这是本章活动中将使用的方法。
......@@ -613,7 +613,7 @@ batch_size = 100
图 3.10:显示如何执行误差分析的图
这些规则并不表示该模型只能遭受上述问题之一(高偏差或高方差),而是通过误差分析检测到的问题对模型的性能影响更大,这意味着 修复它会在很大程度上提高性能。
这些规则并不表示该模型只能遭受上述问题之一(高偏差或高方差),而是通过误差分析检测到的问题对模型的性能影响更大,这意味着修复它会在很大程度上提高性能。
让我们解释一下如何处理这些问题:
......@@ -625,7 +625,7 @@ batch_size = 100
通常可以通过将更多数据添加到训练集中,或通过将正则项添加到损失函数来解决此问题。 第一种方法旨在迫使网络将数据概括化,而不是理解少量示例的细节。 另一方面,第二种方法对权重较高的输入进行惩罚,以忽略异常值,并平等地考虑所有值。
鉴于此,处理影响模型的一种情况可能导致另一种情况出现或增加。 例如,遭受高偏差的模型在经过处理后,可能会在训练数据上而非在验证数据上提高其性能,这意味着该模型将开始遭受高方差,并且将需要另一组补救措施 要采取
鉴于此,处理影响模型的一种情况可能导致另一种情况出现或增加。 例如,遭受高偏差的模型在经过处理后,可能会在训练数据上而非在验证数据上提高其性能,这意味着该模型将开始遭受高方差,并且将需要另一组要采取的补救措施
一旦诊断出模型并采取了必要的措施以改善性能,就应该选择最佳模型进行最终测试。 这些模型中的每一个都应用于对测试集(唯一不影响模型构建的集合)进行预测。
......@@ -756,7 +756,7 @@ batch_size = 100
traced_script = torch.jit.trace(model, example)
```
请记住,名为`model`的变量应包含以前训练过的模型,而名为`example`的变量应包含希望提供给模型以便执行的功能 预测。 这将返回一个脚本模块,可以将其用作常规的 PyTorch 模块,如下所示:
请记住,名为`model`的变量应包含以前训练过的模型,而名为`example`的变量应包含希望提供给模型的特征以便执行预测。 这将返回一个脚本模块,可以将其用作常规的 PyTorch 模块,如下所示:
```py
prediction = traced_script(input)
......@@ -948,7 +948,7 @@ prediction = traced_script(input)
在涵盖了前几章的大部分理论知识之后,本章使用了一个实际案例研究来巩固我们的知识。 这样做的目的是鼓励通过动手实践来学习。
本章首先介绍了深度学习对要求准确率的众多行业的影响。 推动深度学习发展的主要行业之一是银行和金融业,这些算法被用于诸如贷款申请评估,欺诈检测以及过去决策评估以预测未来行为等领域,这主要是由于 在这些方面,算法具有超越人类性能的能力。
本章首先介绍了深度学习对要求准确率的众多行业的影响。 推动深度学习发展的主要行业之一是银行和金融业,这些算法被用于诸如贷款申请评估,欺诈检测以及过去决策评估以预测未来行为等领域,这主要是由于在这些方面,算法具有超越人类性能的能力。
本章使用来自台湾一家银行的真实数据集,目的是预测客户是否会拖欠付款。 本章通过解释定义任何数据问题的内容,原因和方式以及分析手头的数据以对其进行最佳利用的重要性,开始开发针对此问题的解决方案。
......
# 4.卷积神经网络
总览
### 概述
本章介绍了训练**卷积神经网络****CNN**)的过程-也就是说,发生在不同层的计算通常可以在 CNN 架构中找到,其目的 训练过程。 您将学习如何通过对模型应用数据扩充和批量规范化来改善计算机视觉模型的性能。 到本章末,您将能够使用 CNN 通过 PyTorch 解决图像分类问题。 这将是在计算机视觉领域实现其他解决方案的起点。
本章介绍了训练**卷积神经网络****CNN**)的过程-也就是说,发生在不同层的计算通常可以在 CNN 架构中找到,其目的可在训练过程中发现。 您将学习如何通过对模型应用数据扩充和批量规范化来改善计算机视觉模型的性能。 到本章末,您将能够使用 CNN 通过 PyTorch 解决图像分类问题。 这将是在计算机视觉领域实现其他解决方案的起点。
# 简介
......@@ -46,7 +46,7 @@ CNN 能够捕获图像的空间相关性,因为它根据滤镜的大小将它
彩色图像通常使用 RGB 系统表示,该系统将每种颜色表示为红色,绿色和蓝色的组合。 在这里,每个像素将具有三个尺寸,每种颜色一个。 每个维度中的值的范围从 0 到 255。这里,颜色越深,数字越接近 255。
根据上一段,给定图像的矩阵是三维的。 这里,第一维是指图像的高度(以像素数为单位),第二维是指图像的宽度(以像素数为单位),而第三维是指通道,是指通道 图像的配色方案。
根据上一段,给定图像的矩阵是三维的。 这里,第一维是指图像的高度(以像素数为单位),第二维是指图像的宽度(以像素数为单位),而第三维是指通道,是指图像的配色方案。
彩色图像的通道数为三个(RGB 系统中每种颜色一个通道)。 另一方面,灰度图像只有一个通道:
......
# 5.样式迁移
总览
### 概述
本章介绍了使用预训练的模型来创建或利用性能良好的算法而不必收集大量数据的过程。 在本章中,您将学习如何从 PyTorch 加载预训练的模型以创建样式迁移模型。 到本章末,您将能够通过使用预训练的模型来执行样式迁移。
......@@ -266,7 +266,7 @@ transforms.Compose([transforms.Normalize((-0.5/0.25, \
要探索 PyTorch 中可用的其他预训练模型,请访问[这里](https://pytorch.org/docs/stable/torchvision/models.html)。
根据前面的信息,仅应加载模型的特征部分,以便提取内容和样式图像的必要特征。 加载模型包括调用`model`子程序包,然后调用模型名称,并确保将`pretrained`参数设置为`True`(为了 加载先前训练过程中的参数),并按照以下代码片段仅加载要素层:
根据前面的信息,仅应加载模型的特征部分,以便提取内容和样式图像的必要特征。 加载模型包括调用`model`子程序包,然后调用模型名称,并确保将`pretrained`参数设置为`True`(为了加载先前训练过程中的参数),并按照以下代码片段仅加载要素层:
```py
model = models.vgg19(pretrained=True).features
......@@ -279,7 +279,7 @@ for param in model.parameters():
    param.requires_grad_(False)
```
在这里,对于先前加载的模型的每个参数,为了避免计算梯度, `require_grad_`方法设置为`False`,因为目标是利用预先训练的 参数,而不更新它们。
在这里,对于先前加载的模型的每个参数,为了避免计算梯度, `require_grad_`方法设置为`False`,因为目标是利用预先训练的参数,而不更新它们。
## 练习 5.02:在 PyTorch 中加载预先训练的模型
......
# 6.使用 RNN 分析数据序列
总览
### 概述
本章扩展了循环神经网络的概念。 您将了解**循环神经网络****RNN**)的学习过程以及它们如何存储内存。 本章将介绍**长短期记忆****LSTM**)网络架构,该架构使用短期和长期存储器来解决数据序列中的数据问题。 在本章的最后,您将牢固地掌握 RNN 以及如何解决**自然语言处理****NLP**)数据问题。
......@@ -66,7 +66,7 @@
图 6.4:每月销售额的预测(数量)
例如,如果通过预测对几种保健产品的需求,确定对一种产品的需求增加而对另一种产品的需求减少,则公司可以决定生产更多的该产品,并 少其他
例如,如果通过预测对几种保健产品的需求,确定对一种产品的需求增加而对另一种产品的需求减少,则公司可以决定生产更多的该产品,以及更少的其他产品
* **图像识别**:结合 CNN,RNN 可以为图像提供标题或描述。 通过这些模型组合,您可以检测图像中的所有对象,从而确定图像的主要成分。 输出可以是图像中存在的对象的一组标签,图像的描述或图像中相关对象的标题,如下图所示:
......@@ -110,7 +110,7 @@
考虑到这一学习过程,让我们考虑一下过去两年中产品的销售数据。 RNN 能够预测下个月的销售量,因为通过存储最近几个月的信息,RNN 可以检查销售量是增加还是减少。
使用“图 6.7”,可以通过获取上个月的销售额(即当前事件)和短期记忆(代表最近一个月的数据)来处理下个月的预测 几个月)并将其合并。 此操作的输出将包含下个月的预测以及最近几个月的一些相关信息,这些信息将反过来成为后续预测的新短期记忆。
使用“图 6.7”,可以通过获取上个月的销售额(即当前事件)和短期记忆(代表最近一个月的数据)来处理后面几个月的预测并将其合并。 此操作的输出将包含下个月的预测以及最近几个月的一些相关信息,这些信息将反过来成为后续预测的新短期记忆。
此外,重要的是要提到一些 RNN 架构,例如 LSTM 网络,也将能够考虑 2 年前甚至更早的数据(因为它存储了长期内存)。 这将使网络知道特定月份内的减少是否可能继续减少或开始增加。 稍后,我们将更详细地探讨该主题。
......@@ -709,13 +709,13 @@ while starter[-1] != "." and counter < 50:
最后一句话会有所不同,因为在选择每个字符时会有一个随机因素。 但是,它应该看起来像这样:
`So she was considering in her own mind us on," said she whad se the sire.`前面的句子没有意义,因为网络没有经过足够的时间训练(损失函数可能仍然是 最小化),并且可以一次选择每个字符,而无需长期存储以前创建的单词(尽管如此),我们可以看到,仅 20 个周期后,网络就已经能够形成一些有意义的单词。
`So she was considering in her own mind us on," said she whad se the sire.`前面的句子没有意义,因为网络没有经过足够的时间训练(损失函数可能仍然是最小化的),并且可以一次选择每个字符,而无需长期存储以前创建的单词(尽管如此),我们可以看到,仅 20 个周期后,网络就已经能够形成一些有意义的单词。
# 自然语言处理
计算机擅长分析标准化数据,例如财务记录或表中存储的数据库。 实际上,它们具有比人类更好的能力,因为它们能够一次分析数百个变量。 另一方面,人类擅长分析非结构化数据(例如语言),除非计算机掌握了一套规则以帮助他们理解,否则计算机就不会擅长这样做。
考虑到这一点,对于人类语言而言,计算机面临的最大挑战是,即使在一台非常大的数据集上经过很长时间的训练之后,计算机可以擅长分析人类语言,但它们仍然无法理解 句子背后的真实含义,因为它们既不直观也不能够在两行之间阅读。
考虑到这一点,对于人类语言而言,计算机面临的最大挑战是,即使在一台非常大的数据集上经过很长时间的训练之后,计算机可以擅长分析人类语言,但它们仍然无法理解句子背后的真实含义,因为它们既不直观也不能够在两行之间阅读。
这意味着,尽管人类能够理解说“他昨晚着火了,真是个好游戏!”的句子。 指某种运动的运动员的表现,计算机会从字面意义上理解它-意味着它将把它解释为昨晚确实起火的人。
......@@ -760,7 +760,7 @@ NLP 是**人工智能**(**AI**)的子字段,它通过使计算机能够理
* **消除标点符号**。在为 NLP 目的逐字处理文本数据时,删除任何标点符号。这样做是为了避免把同一个词当作两个独立的词,因为其中一个词后面有句号、逗号或任何其他特殊字符。一旦实现了这一点,就可以定义一个包含输入文本词汇的列表(也就是整个词集)。
这可以通过使用`string`模块的`punctuation`预初始化的字符串来完成,该字符串提供了可用于在文本序列中标识它们的标点符号列表,以下代码段:
这可以通过使用`string`模块的`punctuation`预初始化的字符串来完成,该字符串提供了可用于在文本序列中标识它们的标点符号列表,例如以下代码段:
```py
test = pd.Series(['Hey! This is example #1.', \
......
......@@ -1499,7 +1499,7 @@
注意
要查看 高质量彩色图像,请访问本书的 GitHub 存储库,网址为 https://packt.live/2KcORcw。
要查看高质量彩色图像,请访问本书的 GitHub 存储库,网址为 https://packt.live/2KcORcw。
要访问此特定部分的源代码,请参考[这里](https://packt.live/2BZj91B)
......@@ -1560,7 +1560,7 @@
`input`变量应包含除上周外的所有星期的所有产品数据,因为模型的目的是预测最后一周。
`target`变量应比`input`变量领先一步; 也就是说,`target`变量的第一个值应该是输入变量中的第二个,依此类推,直到`target`变量的最后一个值(应该被留在`input`变量之外):
`target`变量应比`input`变量领先一步; 也就是说,`target`变量的第一个值应该是输入变量中的第二个,依此类推,直到`target`变量的最后一个值(应该被留在`input`变量之外):
```py
data_train = data.iloc[:,:-1]
......@@ -1618,7 +1618,7 @@
注意
考虑到没有批量用于遍历数据集,`hidden`量实际上并未在批量之间传递(而是在处理序列的每个元素时使用隐藏状态),但是 为了清楚起见,它留在这里。
考虑到没有批量用于遍历数据集,`hidden`量实际上并未在批量之间传递(而是在处理序列的每个元素时使用隐藏状态),但是为了清楚起见,它留在这里。
```py
losses = []
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册