提交 4fe8df8d 编写于 作者: W wizardforcel

2021-01-21 17:28:55

上级 3fa4a4ef
......@@ -396,7 +396,7 @@ loss_funct = nn.MSELoss()
您已经成功定义了单层网络架构。
### PyTorch 优化软件包
### PyTorch `optim`软件包
`optim`程序包用于定义优化器,该优化器将使用`autograd`计算出的梯度来更新每次迭代中的参数(将在以下各章中进一步说明)。 模块。 在这里,可以从可用的不同优化算法中进行选择,例如 **Adam****随机梯度下降****SGD**)和**均方根传播****RMSprop**)等。
......
......@@ -320,7 +320,7 @@ CNN 创建的模型使用神经元的子组来识别图像的不同方面。 这
此外,考虑到所使用的滤镜,考虑到每个 CNN 都将专注于识别图像的特定特征或一组特征,因此 CNN 通常将具有多个卷积层。 通常,在两个卷积层之间有一个池化层。
2. **池化层**:尽管卷积层能够从图像中提取相关特征,但是当分析复杂的几何形状时它们的结果可能会变得非常巨大,这将使训练过程在计算能力方面成为不可能,因此发明了池层。
2. **池化层**:尽管卷积层能够从图像中提取相关特征,但是当分析复杂的几何形状时它们的结果可能会变得非常巨大,这将使训练过程在计算能力方面成为不可能,因此发明了池层。
这些层不仅实现了减少卷积层输出的目标,而且还消除了已提取特征中存在的任何噪声,最终最终有助于提高模型的准确率。
......
......@@ -2,7 +2,7 @@
总览
在本章中,我们将看一个银行业中的实际例子,以解决分类数据问题。 您将学习如何利用 PyTorch 的自定义模块来定义网络架构并训练模型。 您还将探索错误分析的概念,以提高模型的性能。 最后,您将研究部署模型的不同方法,以便将来使用它。 到本章结束时,您将对该过程有深刻的了解,以便可以使用**深度神经网络****DNN**)在 PyTorch 中。
在本章中,我们将看一个银行业中的实际例子,以解决分类数据问题。 您将学习如何利用 PyTorch 的自定义模块来定义网络架构并训练模型。 您还将探索误差分析的概念,以提高模型的性能。 最后,您将研究部署模型的不同方法,以便将来使用它。 到本章结束时,您将对该过程有深刻的了解,以便可以使用**深度神经网络****DNN**)在 PyTorch 中。
# 简介
......@@ -12,7 +12,7 @@
利用这种模型的一个领域是银行业务。 这主要是由于他们需要根据人口统计数据预测未来的行为,以及确保长期盈利的主要目标。 银行业的一些用途包括评估贷款申请,信用卡批准,预测股票市场价格以及通过分析行为来检测欺诈。
本章将重点介绍使用深层**人工神经网络****ANN**)解决分类库问题的步骤,并遵循建立有效模型所需的所有步骤:数据探索,数据准备, 架构定义和模型训练,模型微调,错误分析,以及最后部署最终模型。
本章将重点介绍使用深层**人工神经网络****ANN**)解决分类库问题的步骤,并遵循建立有效模型所需的所有步骤:数据探索,数据准备, 架构定义和模型训练,模型微调,误差分析,以及最后部署最终模型。
注意
......@@ -32,7 +32,7 @@
2. 分析手头的数据,以确定我们模型的一些关键参数,例如要执行的学习任务的类型,必要的准备工作以及绩效指标的定义。
3. 执行数据准备,以减少将偏差引入模型的可能性。
## 银行深度学习
## 银行深度学习
银行和金融实体每天处理大量信息,这是必需的,以便它们可以做出至关重要的决定,这些决定不仅影响其组织的未来,而且影响数百万信任它们的个人的未来。
......@@ -580,19 +580,19 @@ batch_size = 100
# 处理欠拟合或过拟合的模型
建立深度学习解决方案不仅是定义架构,然后使用输入数据训练模型的问题; 相反,大多数人同意这是容易的部分。 创建高科技模型的技巧要求达到超越人类性能的高精确度。 本节将介绍错误分析主题,该主题通常用于诊断经过训练的模型,以发现哪些操作更可能对模型的性能产生积极影响。
建立深度学习解决方案不仅是定义架构,然后使用输入数据训练模型的问题; 相反,大多数人同意这是容易的部分。 创建高科技模型的技巧要求达到超越人类性能的高精确度。 本节将介绍误差分析主题,该主题通常用于诊断经过训练的模型,以发现哪些操作更可能对模型的性能产生积极影响。
## 错误分析
## 误差分析
错误分析是指对训练和验证数据集上的错误率进行的初始分析。 然后,使用此分析来确定改善模型性能的最佳措施。
误差分析是指对训练和验证数据集上的错误率进行的初始分析。 然后,使用此分析来确定改善模型性能的最佳措施。
为了执行误差分析,有必要确定贝叶斯误差(也称为不可约误差),它是可实现的最小误差。 几十年前,贝叶斯错误等同于人为错误,这意味着专家认为可以达到的最低错误级别。
如今,随着技术和算法的改进,由于机器具有超越人类性能的能力,因此难以估计此值。 没有办法衡量他们与人类相比能做的更好,因为我们只能了解我们的能力。
为了执行错误分析,通常首先将贝叶斯错误设置为等于人为错误。 然而,这种局限性并非一成不变,研究人员认为,超越人类的表现也应是最终目标。
为了执行误差分析,通常首先将贝叶斯错误设置为等于人为错误。 然而,这种局限性并非一成不变,研究人员认为,超越人类的表现也应是最终目标。
执行错误分析的过程如下:
执行误差分析的过程如下:
1. 计算选择的度量标准以衡量模型的性能。 应该在训练和验证数据集上计算该度量。
2. 使用此度量,通过减去以前从 1 中计算出的性能指标来计算每个集合的错误率。以下面的等式为例:
......@@ -611,7 +611,7 @@ batch_size = 100
![Figure 3.10: Diagram showing how to perform error analysis ](img/B15778_03_10.jpg)
图 3.10:显示如何执行错误分析的图
图 3.10:显示如何执行误差分析的图
这些规则并不表示该模型只能遭受上述问题之一(高偏差或高方差),而是通过误差分析检测到的问题对模型的性能影响更大,这意味着 修复它会在很大程度上提高性能。
......@@ -631,9 +631,9 @@ batch_size = 100
考虑到这一点,可以选择最终模型作为对测试数据表现最佳的模型。 这主要是因为测试数据的性能可以作为模型在未来未见数据集上的性能指标,这是最终目标。
## 练习 3.02:执行错误分析
## 练习 3.02:执行误差分析
使用我们在上一个活动中计算的准确率指标,在此活动中,我们将执行错误分析,这将有助于我们确定在即将到来的活动中针对模型执行的操作。 请按照以下步骤完成此练习:
使用我们在上一个活动中计算的准确率指标,在此活动中,我们将执行误差分析,这将有助于我们确定在即将到来的活动中针对模型执行的操作。 请按照以下步骤完成此练习:
注意
......@@ -662,7 +662,7 @@ batch_size = 100
据此,可以执行一组测试以便获得最佳结果。
这样,您就成功地执行了错误分析。 该方法是开发最先进的深度学习解决方案的关键,该解决方案在看不见的数据上表现出色。
这样,您就成功地执行了误差分析。 该方法是开发最先进的深度学习解决方案的关键,该解决方案在看不见的数据上表现出色。
## 练习 3 .02:提高模型的性能
......@@ -689,7 +689,7 @@ batch_size = 100
可以在第 250 页上找到此活动的解决方案。
这样,您就可以使用错误分析成功改善模型的性能。 接下来,您将学习如何部署模型以在生产环境中使用它。
这样,您就可以使用误差分析成功改善模型的性能。 接下来,您将学习如何部署模型以在生产环境中使用它。
# 部署模型
......@@ -742,7 +742,7 @@ batch_size = 100
调用时,此函数将返回已训练的模型,该模型现在可用于进一步的训练或执行推理。
## 用于 C++ 生产的 PyTorch
## 用于生产的 C++ 和 PyTorch
按照框架的名称,PyTorch 的主要接口是 Python 编程语言。 这主要是由于在开发机器学习解决方案时,由于该语言的动态性和易用性,因此许多用户偏爱该编程语言。
......
......@@ -38,7 +38,7 @@ CNN 能够捕获图像的空间相关性,因为它根据滤镜的大小将它
图像的每个块都具有一组参数(权重和偏差),这些参数将取决于该组像素与整个图像的相关性,具体取决于手边的滤镜。 这意味着垂直边缘滤镜将为包含垂直边缘的图像块分配更大的权重。 据此,通过减少参数数量并通过分块分析图像,CNN 可以呈现更好的图像表示形式。
## 图像作为输入
## 作为输入的图像
如前所述,CNN 的典型输入是矩阵形式的图像。 矩阵的每个值代表图像中的一个像素,其中的数字由颜色的强度决定,其范围为 0 到 255。
......@@ -77,15 +77,15 @@ CNN 可以执行不同的任务,这些任务适用于所有监督学习问题
图 4.3:分类任务
### 本地化
### 定位
本地化的主要目的是生成一个边界框,以描述对象在图像中的位置。 输出由一个类标签和一个边界框组成。
定位的主要目的是生成一个边界框,以描述对象在图像中的位置。 输出由一个类标签和一个边界框组成。
此任务可用于传感器中,以确定对象在屏幕的左侧还是右侧:
![Figure 4.4: Localization task ](img/B15778_04_04.jpg)
图 4.4:本地化任务
图 4.4:定位任务
### 检测
......@@ -97,7 +97,7 @@ CNN 可以执行不同的任务,这些任务适用于所有监督学习问题
图 4.5:检测任务
### 细分
### 分割
这里的任务是输出图像中存在的每个对象的类标签和轮廓。 这主要用于标记图像的重要对象以进行进一步分析。
......@@ -105,7 +105,7 @@ CNN 可以执行不同的任务,这些任务适用于所有监督学习问题
![Figure 4.6: Segmentation task ](img/B15778_04_06.jpg)
图 4.6:细分任务
图 4.6:分割任务
从本节开始,本章将重点介绍训练模型以使用 PyTorch 的图像数据集之一进行图像分类。
......@@ -297,7 +297,7 @@ class CNN_network(nn.Module):
在前面的示例中,在**顺序**容器内定义了卷积层和激活层。 因此,在`forward`方法中,不需要卷积层的输出通过激活函数,因为已经使用容器对其进行了处理。
### 池层
### 池
按照惯例,池化层是特征选择步骤的最后部分,这就是为什么池化层通常可以在卷积层之后找到的原因。 正如我们在前几章中所解释的那样,其思想是从图像的各个子部分中提取最相关的信息。 池化层的大小通常为 2,步幅等于其大小。
......@@ -326,7 +326,7 @@ class CNN_network(nn.Module):
考虑以下几组层,并在所有转换结束时指定输出层的形状,并考虑`256 x 256 x 3`的输入图像:
1. 卷积层,具有 16 个大小为 3 的滤镜,步幅和填充为 1。
2. 池层还具有大小为 2 的过滤器以及大小为 2 的步幅。
2.层还具有大小为 2 的过滤器以及大小为 2 的步幅。
3. 卷积层,具有八个大小为 7 的滤镜,跨度为 1,填充为 3。
4. 池化层,其过滤器的大小为 2,步幅也为 2。
......@@ -374,7 +374,7 @@ class CNN_network(nn.Module):
这样,您就成功地计算了从一系列卷积和池化层派生的矩阵的输出形状。
使用与以前相同的编码示例,以下代码片段展示了 PyTorch 定义池层的方法:
使用与以前相同的编码示例,以下代码片段展示了 PyTorch 定义池层的方法:
```py
import torch.nn as nn
......@@ -390,7 +390,7 @@ class CNN_network(nn.Module):
        return x
```
可以看出,在`__init__`方法中将池化层(`MaxPool2d`)添加到网络架构中。 在这里,进入最大池层的参数从左到右分别是过滤器(`2`)和步幅(`2`)的大小。 接下来,更新了`forward`方法,以使信息通过新的合并层。
可以看出,在`__init__`方法中将池化层(`MaxPool2d`)添加到网络架构中。 在这里,进入最大池层的参数从左到右分别是过滤器(`2`)和步幅(`2`)的大小。 接下来,更新了`forward`方法,以使信息通过新的合并层。
同样,这里显示了一种同样有效的方法,其中使用了自定义模块和**顺序**容器:
......@@ -752,7 +752,7 @@ class CNN(nn.Module):
如我们所见,批量规范化层的初始定义与`__init__`方法内的其他任何层类似。 接下来,在`forward`方法内的激活函数之后,将每个批量归一化层应用于其对应层的输出。
## 活动 4.03:实现批量标准
## 活动 4.03:实现批量归一
对于此活动,我们将在前一个活动的架构上实现批量归一化,以查看是否有可能进一步提高测试集上模型的性能。 让我们看一下以下情况。
......
......@@ -319,7 +319,7 @@ for param in model.parameters():
这样,您已经成功加载了预训练的模型。
## 提取功能
## 提取特征
正如我们前面提到的,VGG-19 网络包含 19 个不同的层,包括卷积,池化和全连接层。 卷积层在每个池化层之前先进入堆栈,其中五个是整个架构中的堆栈数。
......@@ -465,23 +465,23 @@ style_features = features_extractor(style_img, model, \
为了实现目标图像的创建,需要计算两个不同的损失函数(内容损失和样式损失),然后将它们放在一起以计算总损失函数,该函数将被优化以得到合适的目标图像。 但是,考虑到在内容和样式方面实现的测量精度差异很大,下面是对内容和样式损失函数的计算的说明,以及如何计算总损失的说明。
### 内容
### 内容
它由一个功能组成,该功能基于给定层获得的特征图来计算内容图像和目标图像之间的距离。 在 VGG-19 网络的情况下,仅根据`conv4_2`层的输出来计算内容损失。
内容失功能背后的主要思想是最小化内容图像和目标图像之间的距离,以便后者在内容方面与前者高度相似。
内容失功能背后的主要思想是最小化内容图像和目标图像之间的距离,以便后者在内容方面与前者高度相似。
内容损失可以计算为相关层的内容和目标图像的特征图之间的均方差(`conv4_2`),可以使用以下公式实现:
![Figure 5.6: The content loss function ](img/B15778_05_06.jpg)
图 5.6:内容失功能
图 5.6:内容失功能
### 样式
### 样式
与内容丢失类似,样式丢失是一项功能,可通过计算均方差来衡量样式特征(例如颜色和纹理)方面的样式与目标图像之间的距离。
与内容损失类似,样式损失是一项功能,可通过计算均方差来衡量样式特征(例如颜色和纹理)方面的样式与目标图像之间的距离。
与内容失的情况相反,它不比较从不同层派生的特征图,而是比较根据样式和目标图像的特征图计算出的语法矩阵。
与内容失的情况相反,它不比较从不同层派生的特征图,而是比较根据样式和目标图像的特征图计算出的语法矩阵。
必须使用循环为所有相关层(在本例中为五层)计算样式损失。 这将导致损失函数考虑来自两个图像的简单和复杂样式表示。
......@@ -674,7 +674,7 @@ style_features = features_extractor(style_img, model, \
本章介绍了开发能够执行样式转换任务的代码所需的每个步骤,其中第一步包括加载和显示输入。 正如我们前面提到的,模型有两个输入(内容和样式图像)。 每个图像都将经历一系列转换,目的是将图像调整为相等大小,将它们转换为张量,并对它们进行规范化,以使它们可以被网络正确处理。
接下来,加载预训练的模型。 如本章所述,VGG-19 是解决此类任务的最常用架构之一。 它由 19 个层组成,包括卷积层,池层和全连接层,其中对于所讨论的任务,仅使用某些卷积层。 考虑到 PyTorch 提供了一个包含多个预训练网络架构的子包,加载预训练模型的过程非常简单。
接下来,加载预训练的模型。 如本章所述,VGG-19 是解决此类任务的最常用架构之一。 它由 19 个层组成,包括卷积层,池层和全连接层,其中对于所讨论的任务,仅使用某些卷积层。 考虑到 PyTorch 提供了一个包含多个预训练网络架构的子包,加载预训练模型的过程非常简单。
一旦加载了网络,在检测某些对于样式转换至关重要的功能时,网络的某些层将被识别为性能卓越的提供商。 尽管五个不同的层都具有提取与图像样式相关的特征(例如颜色和纹理)的能力,但是只有一层可以非常出色地提取内容特征(例如边缘和形状)。 因此,至关重要的是定义将用于从输入图像中提取信息以创建所需目标图像的那些层。
......
......@@ -366,7 +366,7 @@ for i in range(1, epochs+1):
第一步是将文本文件加载到代码中。 这些数据将经过一系列转换,以便正确地输入到模型中。 这是必需的,因为神经网络执行一系列数学计算才能得出输出,这意味着所有输入都必须是数字。 另外,将数据批量而不是一次全部馈入模型也是一个好习惯,因为这有助于减少训练时间,尤其是对于长数据集。 这些转换将在以下小节中进行说明。
### 编号标签
### 数字标签
首先,从输入数据中获得未重复字符的列表。 这些字符中的每一个都分配有一个数字。 然后,考虑到必须始终用相同的数字表示相同的字母,通过将每个字符替换为指定的数字来对输入数据进行编码。 例如,给定以下字符和数字映射,单词`hello`将被编码为 12334:
......@@ -427,7 +427,7 @@ for b in range(0, x.shape[1], 5):
尽管生成批量被视为预处理数据的一部分,但通常会在训练过程的`for`循环内部对其进行编程。
## 一键编码
## 单热编码
将所有字符转换为数字不足以将其输入模型。 这是因为这种近似会给您的模型带来一些偏差,因为转换为更高数值的字符将被视为更重要。 为避免这种情况,优良作法是将不同批量编码为一热矩阵。 这包括创建一个具有零和一的三维矩阵,其中零表示不存在事件,而一个表示存在事件。 矩阵的最终形状应为`one hot = [number of sequences, sequence length, number of characters]`
......@@ -435,7 +435,7 @@ for b in range(0, x.shape[1], 5):
注意
您可以在[这个页面](https://www.geeksforgeeks.org/ml-one-hot-encoding-of-datasets-in-python/)中找到有关一键编码的更多信息。
您可以在[这个页面](https://www.geeksforgeeks.org/ml-one-hot-encoding-of-datasets-in-python/)中找到有关单热编码的更多信息。
这可以通过以下代码片段实现:
......@@ -452,7 +452,7 @@ onehot = onehot_flat.reshape((batch.shape[0],\
首先,将二维批量展平。 接下来,创建一个矩阵,并用零填充。 当我们需要在给定位置表示正确的字符时,用零代替零。 最后,展平的尺寸再次扩大。
## 练习 6.02:预处理输入数据并创建一倍热矩阵
## 练习 6.02:预处理输入数据并创建热矩阵
在本练习中,您将预处理文本片段,然后将其转换为一键式矩阵。 请按照以下步骤完成此练习:
......
......@@ -479,7 +479,7 @@
您也可以通过[这里](https://packt.live/2NNBuRS)在线运行此示例。 您必须执行整个笔记本才能获得所需的结果。
## 练习 3.02:提高模型的性能
## 练习 3.02:提高模型的表现
解:
......@@ -1997,7 +1997,7 @@
要访问此源代码的 GPU 版本,请参考[这里](https://packt.live/3g9X6UI)。 此版本的源代码无法作为在线交互示例使用,需要通过 GPU 设置在本地运行。
## 活动 6.03:执行情感分析的 NLP
## 活动 6.03:用于情感分析的 NLP
### 解决方案
......
......@@ -201,7 +201,7 @@
例如,如果我们有 2 个类,分别为 0 和 1,则 2 个示例(`k = 2`)如下:`y = (0, 1)`
通过将`y`变成一键编码向量,我们将获得以下信息:
通过将`y`变成单热编码向量,我们将获得以下信息:
![](img/725b5feb-44c8-43ed-8a13-b4c530b590e8.png)
......
......@@ -241,11 +241,11 @@ The dog sat on the cat -> [2,1,1,1,1,0]
## 序列表示
我们将在本书的后面看到,更复杂的神经网络模型,包括 RNN 和 LSTM,不仅将一个向量作为输入,而且可以采用矩阵形式的整个向量序列。 因此,为了更好地捕获单词的顺序,从而更好地捕获任何句子的含义,我们能够以一键编码的向量序列的形式来表示它:
我们将在本书的后面看到,更复杂的神经网络模型,包括 RNN 和 LSTM,不仅将一个向量作为输入,而且可以采用矩阵形式的整个向量序列。 因此,为了更好地捕获单词的顺序,从而更好地捕获任何句子的含义,我们能够以单热编码的向量序列的形式来表示它:
![Figure 1.16 – One-hot encoded vectors ](img/B12365_01_16.jpg)
图 1.16 –一键编码向量
图 1.16 –单热编码向量
# 总结
......
......@@ -19,11 +19,11 @@
# NLP 的嵌入
单词没有表示其含义的自然方式。 在图像中,我们已经具有丰富的向量表示形式(包含图像中每个像素的值),因此显然具有单词的类似丰富的向量表示形式将是有益的。 当语言的部分以高维向量格式表示时,它们称为**嵌入**。 通过分析单词的语料库,并确定哪些单词经常出现在一起,我们可以获得每个单词的`n`长度向量,它可以更好地表示每个单词与所有其他单词的语义关系。 先前我们看到,我们可以轻松地将单词表示为一键编码的向量:
单词没有表示其含义的自然方式。 在图像中,我们已经具有丰富的向量表示形式(包含图像中每个像素的值),因此显然具有单词的类似丰富的向量表示形式将是有益的。 当语言的部分以高维向量格式表示时,它们称为**嵌入**。 通过分析单词的语料库,并确定哪些单词经常出现在一起,我们可以获得每个单词的`n`长度向量,它可以更好地表示每个单词与所有其他单词的语义关系。 先前我们看到,我们可以轻松地将单词表示为单热编码的向量:
![Figure 3.1 – One-hot encoded vectors ](img/B12365_03_1.jpg)
图 3.1 –一键编码向量
图 3.1 –单热编码向量
另一方面,嵌入是长度为`n`(在以下示例中为`n = 3`)的向量,可以采用任何值:
......
......@@ -680,7 +680,7 @@ CNN(
对于第一个全连接层,我们有 1,024 个输入(通过将最大池后的`64 x 4 x 4`张量展平而获得)和 512 个输出。 对于最后一个全连接层,我们有 512 个输入和 10 个输出,代表输出类别的数量。 我们还为全连接层定义了一个丢弃层,概率为 0.3。
接下来,我们定义`forward()`方法,将`__init__()`方法中定义的组件连接在一起。 因此,输入批量的 16 个张量(每个张量为`32 x 32 x 3`)经过第一个卷积层,然后经过 ReLU,然后是最大合并层,以形成尺寸为`16 x 16 x 16`的输出张量,然后通过第二个卷积层,然后是 ReLU 和最大池层,输出的尺寸为`8 x 8 x 32`,然后是第三个卷积层,然后是 ReLU 和最大池 层,尺寸为`4 x 4 x 64`。此后,我们将图像展平为 1,024 个元素的向量,并将其通过丢弃层传递到第一个全连接层,提供 512 个输出,然后是 ReLU 和 在最后一个全连接层中删除,以提供所需的输出数量,本例中为 10。
接下来,我们定义`forward()`方法,将`__init__()`方法中定义的组件连接在一起。 因此,输入批量的 16 个张量(每个张量为`32 x 32 x 3`)经过第一个卷积层,然后经过 ReLU,然后是最大合并层,以形成尺寸为`16 x 16 x 16`的输出张量,然后通过第二个卷积层,然后是 ReLU 和最大池层,输出的尺寸为`8 x 8 x 32`,然后是第三个卷积层,然后是 ReLU 和最大池 层,尺寸为`4 x 4 x 64`。此后,我们将图像展平为 1,024 个元素的向量,并将其通过丢弃层传递到第一个全连接层,提供 512 个输出,然后是 ReLU 和 在最后一个全连接层中删除,以提供所需的输出数量,本例中为 10。
然后,我们从 CNN 类实例化该模型并打印该模型。
......
......@@ -190,7 +190,7 @@ for epoch in range(epochs):
即使不是全部,我们也可以预测大多数结果。 但是,如果我们可以从中进行预测的数据点数量太多而又无法用凡人的大脑来处理它们该怎么办? 计算机可以浏览数据,并可能根据以前的数据吐出答案。 这种数据驱动的方法可以为我们提供很多帮助,因为我们唯一要做的就是假设相关的功能,然后将其交给包含不同算法的黑盒,以从功能集中学习规则或模式。
有问题。 即使我们知道要查找的内容,清理数据并提取功能也不是一件有趣的事情。 然而,最主要的麻烦不是这个。 我们无法有效预测高维数据和其他媒体类型的数据的功能。 例如,在人脸识别中,我们最初使用基于规则的程序找到人脸的细节长度,并将其作为输入输入神经网络,因为我们认为这是人类用来识别人脸的特征集。
有问题。 即使我们知道要查找的内容,清理数据并提取特征也不是一件有趣的事情。 然而,最主要的麻烦不是这个。 我们无法有效预测高维数据和其他媒体类型的数据的功能。 例如,在人脸识别中,我们最初使用基于规则的程序找到人脸的细节长度,并将其作为输入输入神经网络,因为我们认为这是人类用来识别人脸的特征集。
![Exploring deep learning](img/B09475_01_08.jpg)
......
......@@ -223,7 +223,7 @@ pip install torchtext
用于此类数据集上的 NLP 任务的常规数据预处理管道包括:
* 将数据集分为训练集,测试集和验证集。
* 将数据集转换为神经网络可以理解的形式。 数值化,一键编码和词嵌入是常见的方法。
* 将数据集转换为神经网络可以理解的形式。 数值化,单热编码和词嵌入是常见的方法。
* 批量。
* 填充到最长序列的长度。
......
......@@ -120,9 +120,9 @@ class SimpleCNNModel(nn.Module):
return x
```
该模型具有由最大池层分隔的两个卷积层。 第二个卷积层连接到三个全连接层,一个接一个,将十个类的分数吐出来。
该模型具有由最大池层分隔的两个卷积层。 第二个卷积层连接到三个全连接层,一个接一个,将十个类的分数吐出来。
我们为`SimpleCNNModel`构建了自定义卷积和最大池层。 定制层可能是实现这些层的效率最低的方法,但是它们具有很高的可读性和易于理解性。
我们为`SimpleCNNModel`构建了自定义卷积和最大池层。 定制层可能是实现这些层的效率最低的方法,但是它们具有很高的可读性和易于理解性。
```py
class Conv(nn.Module):
......@@ -200,7 +200,7 @@ Variable containing:
我们拥有的自定义卷积层可以完成卷积。 它接受输入和输出通道的数量,内核大小,步幅和填充作为参数。 内核的形状为`[kernel_size, kernel_size, input_channels]`。 我们没有创建`n`个内核并将输出堆叠在一起以获得多通道输出,而是创建了一个大小为`output_channel, input_channel, kernal_size, kernal_size`的单个权重张量,这给出了我们想要的。
在所有池化选项中,人们倾向于使用最大池化。 合并操作采用张量的一个子部分,并获取单个值作为输出。 最大池从概念上讲获取该子部件的突出特征,而平均池则取平均值并平滑该特征。 而且,从历史上看,最大池化比其他池化算法提供更好的结果,可能是因为它从输入中获取最突出的特征并将其传递到下一个级别。 因此,我们也使用最大池。 定制的最大池层具有相同的结构,但是复杂的卷积操作由简单的最大操作代替。
在所有池化选项中,人们倾向于使用最大池化。 合并操作采用张量的一个子部分,并获取单个值作为输出。 最大池从概念上讲获取该子部件的突出特征,而平均池则取平均值并平滑该特征。 而且,从历史上看,最大池化比其他池化算法提供更好的结果,可能是因为它从输入中获取最突出的特征并将其传递到下一个级别。 因此,我们也使用最大池。 定制的最大池层具有相同的结构,但是复杂的卷积操作由简单的最大操作代替。
```py
out = torch.zeros(batch_size, depth, new_height, new_width)
......@@ -229,9 +229,9 @@ PyTorch 的`max()`方法接受尺寸作为输入,并返回具有索引/索引
```
例如,前面示例中的`max(0)`返回一个元组。 元组中的第一个元素是张量,其值为 3 和 4,这是第 0 维的最大值;另一个张量,其值为 1 和 1,是该维的 3 和 4 的索引。 最大池层的最后一行通过采用第二维的`max()`和第一维的`max()`来获取子部件的最大值。
例如,前面示例中的`max(0)`返回一个元组。 元组中的第一个元素是张量,其值为 3 和 4,这是第 0 维的最大值;另一个张量,其值为 1 和 1,是该维的 3 和 4 的索引。 最大池层的最后一行通过采用第二维的`max()`和第一维的`max()`来获取子部件的最大值。
卷积层和最大池层之后是三个线性层(全连接),这将维数减小到 10,从而为每个类给出了概率得分。 接下来是 PyTorch 模型存储为实际网络图的字符串表示形式。
卷积层和最大池层之后是三个线性层(全连接),这将维数减小到 10,从而为每个类给出了概率得分。 接下来是 PyTorch 模型存储为实际网络图的字符串表示形式。
```py
>>> simple = SimpleCNNModel()
......@@ -511,7 +511,7 @@ class DecoderBlock(nn.Module):
return conv2
```
这样,我们的 LinkNet 模型设计就完成了。 我们将所有构造块放在一起以创建 LinkNet 模型,然后在开始训练之前使用`torchvision`预处理输入。 `__init__`将初始化整个网络架构。 它将创建初始块和最大池层,四个编码器块,四个解码器块和两个包装另一个`conv`块的`deconv`块。 四个解码器块对图像进行升采样,以补偿由四个编码器完成的降采样。 编码器块(其中四个)之前的大步卷积和最大池层也对图像进行了下采样两次。 为了弥补这一点,我们有两个`DeconvBlocks`,其中放置在`DeconvBlock`之间的`ConvBlock`完全不影响尺寸。
这样,我们的 LinkNet 模型设计就完成了。 我们将所有构造块放在一起以创建 LinkNet 模型,然后在开始训练之前使用`torchvision`预处理输入。 `__init__`将初始化整个网络架构。 它将创建初始块和最大池化层,四个编码器块,四个解码器块和两个包装另一个`conv`块的`deconv`块。 四个解码器块对图像进行升采样,以补偿由四个编码器完成的降采样。 编码器块(其中四个)之前的大步卷积和最大池化层也对图像进行了下采样两次。 为了弥补这一点,我们有两个`DeconvBlocks`,其中放置在`DeconvBlock`之间的`ConvBlock`完全不影响尺寸。
前向调用只是将所有初始化变量链接在一起,但是需要注意的部分是`DecoderBlock`。 我们必须将预期的输出传递给`DecoderBlock`,然后将其传递给`torch.nn.ConvTranspose2d`。 同样,我们将编码器输出的输出添加到下一步的解码器输入中。 这是我们之前看到的跳跃连接。 由于我们将编码器输出直接传递给解码器,因此我们传递了一些重建图像所需的信息。 这就是 LinkNet 即使在不影响速度的情况下也能如此出色运行的根本原因。
......
......@@ -75,7 +75,7 @@ PixelCNN 捕获参数中像素之间的依存关系分布,这与其他方法
整个网络中使用两种类型的掩码,但是后面的层不需要具有这种安全性,尽管它们在进行并行卷积操作时仍需要模拟顺序学习。 因此,PixelCNN 论文[1]引入了两种类型的蒙版:类型 A 和类型 B。
使 PixelCNN 与其他传统 CNN 模型脱颖而出的主要架构差异之一是缺少池层。 由于 PixelCNN 的目的不是以缩小尺寸的形式捕获图像的本质,并且我们不能承担通过合并丢失上下文的风险,因此作者故意删除了合并层。
使 PixelCNN 与其他传统 CNN 模型脱颖而出的主要架构差异之一是缺少池层。 由于 PixelCNN 的目的不是以缩小尺寸的形式捕获图像的本质,并且我们不能承担通过合并丢失上下文的风险,因此作者故意删除了合并层。
```py
fm = 64
......
......@@ -581,13 +581,13 @@ LeNet-5 是一个七级卷积神经网络,由 Yann LeCunn,Yoshua Bengio,Le
AlexNet 是 LeNet 的一种改进,由 SuperVision 小组设计,该小组由 Alex Krizhevsky,Geoffrey Hinton 和 Ilya Sutskever 组成。 在 2012 年 ImageNet 大规模视觉识别挑战赛中,AlexNet 的前 5 位错误率达到 15.3%,比第二名高出 10 个百分点,创造了历史记录。
该架构使用五个卷积层,三个最大池层和最后三个全连接层,如下图所示。 该模型总共训练了 6000 万个参数,训练了 120 万张图像,在两个 NVIDIA GTX 580 3GB GPU 上花费了大约五到六天的时间。 下图显示了 AlexNet 模型:
该架构使用五个卷积层,三个最大池层和最后三个全连接层,如下图所示。 该模型总共训练了 6000 万个参数,训练了 120 万张图像,在两个 NVIDIA GTX 580 3GB GPU 上花费了大约五到六天的时间。 下图显示了 AlexNet 模型:
![](img/d75582a1-ff11-41b9-8162-3c52f80b141f.png)
Hinton 等人[《用于 ImageNet 分类的深度卷积神经网络的 AlexNet 架构》](https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf)
卷积层 1 -> 最大池层 1 -> 归一化层 1 -> 卷积层 2 -> 最大池层 2 -> 归一化层 2 -> 卷积层 3 -> 卷积层 4 -> 卷积层 5 -> 最大池层 3 -> 全连接 6 -> 全连接 7 -> 全连接 8 -> 输出
卷积层 1 -> 最大池化层 1 -> 归一化层 1 -> 卷积层 2 -> 最大池化层 2 -> 归一化层 2 -> 卷积层 3 -> 卷积层 4 -> 卷积层 5 -> 最大池化层 3 -> 全连接 6 -> 全连接 7 -> 全连接 8 -> 输出
# VGG-Net 模型
......
......@@ -47,7 +47,7 @@
与传统 CNN 方法中的最大池化不同,空间池化是在 SPP-net 中的最后一个卷积层之后进行的。 该空间池化层将任意大小的盒子区域划分为固定数量的容器,并在每个容器上进行最大池化。
SPP 网络的一大缺点是,只能微调网络的全连接层,而不能进行不会发生反向传播的空间池层。
SPP 网络的一大缺点是,只能微调网络的全连接层,而不能进行不会发生反向传播的空间池层。
# 快速 R-CNN
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册