Update Automatic reference

This commit is contained in:
Eric_lai
2022-01-28 11:36:16 +08:00
parent 5ff00cf99e
commit ef354089a4
9 changed files with 49 additions and 38 deletions

View File

@@ -4,7 +4,7 @@
:width:`800px`
:label:`img_framedh`
随着机器学习系统的诞生,如何设计易用且高性能的编程接口就一直成为了框架设计者首要解决的问题。在早期的机器学习框架中(如图2.1.1所示人们选择用LuaTorch和PythonTheano等高层次编程语言来编写机器学习程序。这些早期的机器学习框架提供了机器学习必须的模型定义自动微分等功能其适用于编写小型和科研为导向的机器学习应用。
随着机器学习系统的诞生,如何设计易用且高性能的编程接口就一直成为了框架设计者首要解决的问题。在早期的机器学习框架中(如 :numref:`img_framedh`所示人们选择用LuaTorch和PythonTheano等高层次编程语言来编写机器学习程序。这些早期的机器学习框架提供了机器学习必须的模型定义自动微分等功能其适用于编写小型和科研为导向的机器学习应用。
在2011年深度神经网络快速崛起并很快在各个AI应用领域计算机视觉语音识别自然语言处理等取得了最先进的性能。训练深度神经网络需要消耗大量的算力而这些算力无法被以Lua和Python所主导开发的Torch和Theano所满足。与此同时计算加速卡如英伟达GPU的通用编程接口例如CUDA
C日趋成熟而构建于CPU多核技术之上的多线程库POSIX

View File

@@ -1,6 +1,6 @@
## 机器学习工作流
机器学习系统编程模型的首要设计目标是:对开发者的整个工作流进行完整的编程支持。一个常见的机器学习任务一般包含如图2.2.1所示的流程。这个工作流完成了训练数据集的读取模型的训练测试和调试。通过归纳我们可以将这一工作流中用户所需要自定义的部分通过定义以下API来支持我们这里假设用户的高层次API以Python函数的形式提供
机器学习系统编程模型的首要设计目标是:对开发者的整个工作流进行完整的编程支持。一个常见的机器学习任务一般包含如 :numref:`img_workflow`所示的流程。这个工作流完成了训练数据集的读取模型的训练测试和调试。通过归纳我们可以将这一工作流中用户所需要自定义的部分通过定义以下API来支持我们这里假设用户的高层次API以Python函数的形式提供
- **数据处理:**
首先用户需要数据处理API来支持将数据集从磁盘读入。进一步用户需要对读取数据进行数据预处理从而可以将数据输入后续的机器学习模型中。

View File

@@ -7,20 +7,20 @@
神经网络层包含构建机器学习网络结构的基本组件,如计算机视觉领域常用到卷积(Convolution)、池化(Pooling)、全连接(Fully Connected);自然语言处理常用到循环神经网络(Recurrent Neural NetworkRNN)为了加速训练防止过拟合通常用到批标准化BatchNorm、Dropout等。
**全连接**是将当前层每个节点都和上一层节点一一连接,本质上是特征空间的线性变换;可以将数据从高维映射到低维,也能从低维映射到高维度。
图2.3.1展示了全连接的过程对输入的n个数据变换到另一个大小为m的特征空间再从大小为m的特征空间变换到大小为p的特征空间可见全连接层的参数量巨大两次变换所需的参数大小为$n \times m$和$m \times p$。
:numref:`fc_layer`展示了全连接的过程对输入的n个数据变换到另一个大小为m的特征空间再从大小为m的特征空间变换到大小为p的特征空间可见全连接层的参数量巨大两次变换所需的参数大小为$n \times m$和$m \times p$。
![全连接层](../img/ch02/fc_layer_1.svg)
:width:`800px`
:label:`fc_layer`
**卷积**操作是卷积神经网络中常用的操作之一卷积相当于对输入进行滑动滤波。根据卷积核Kernel、卷积步长Stride、填充Padding对输入数据从左到右从上到下进行滑动每一次滑动操作是矩阵的乘加运算得到的加权值。
图2.3.2卷积操作主要由输入、卷积核、输出组成输出又被称为特征图Feature Map
:numref:`conv_comp`卷积操作主要由输入、卷积核、输出组成输出又被称为特征图Feature Map
![卷积操作的组成](../img/ch02/conv_component.svg)
:width:`800px`
:label:`conv_comp`
卷积的具体运算过程我们通过图2.3.3进行演示。该图输入为$4 \times 4$的矩阵,卷积核大小为$3 \times 3$卷积步长为1不填充最终得到的$2 \times 2$的输出矩阵。
卷积的具体运算过程我们通过 :numref:`single_conv`进行演示。该图输入为$4 \times 4$的矩阵,卷积核大小为$3 \times 3$卷积步长为1不填充最终得到的$2 \times 2$的输出矩阵。
计算过程为将$3 \times 3$的卷积核作用到左上角$3 \times 3$大小的输入图上;输出为$1 \times 1 + 2 \times 0 + 2 \times 1 + 3 \times 0 + 2 \times 1 + 3 \times 0 + 4 \times 1 + 1 \times 0 + 3 \times 1 = 12$,
同理对卷积核移动1个步长再次执行相同的计算步骤得到第二个输出为11当再次移动将出界时结束从左往右执行从上往下移动1步再进行从左往右移动依次操作直到从上往下再移动也出界时结束整个卷积过程得到输出结果。我们不难发现相比于全连接卷积的优势是参数共享同一个卷积核遍历整个输入图和参数量小卷积核大小即是参数量
@@ -31,20 +31,20 @@
在卷积过程中如果我们需要对输出矩阵大小进行控制那么就需要对步长和填充进行设置。还是上面的输入图如需要得到和输入矩阵大小一样的输出矩阵步长为1时就需要对上下左右均填充一圈全为0的数。
在上述例子中我们介绍了一个输入一个卷积核的卷积操作。通常情况下我们输入的是彩色图片有三个输入这三个输入称为通道Channel分别代表红、绿、蓝RGB。此时我们执行卷积则为多通道卷积需要三个卷积核分别对RGB三个通道进行上述卷积过程之后将结果加起来。
具体如图2.3.4描述了一个输入通道为3输出通道为1卷积核大小为$3 \times 3$卷积步长为1的多通道卷积过程需要注意的是每个通道都有各自的卷积核同一个通道的卷积核参数共享。如果输出通道为$out_c$,输入通道为$in_c$,那么需要$out_c$$\times$$in_c$个卷积核。
具体如 :numref:`channels_conv`描述了一个输入通道为3输出通道为1卷积核大小为$3 \times 3$卷积步长为1的多通道卷积过程需要注意的是每个通道都有各自的卷积核同一个通道的卷积核参数共享。如果输出通道为$out_c$,输入通道为$in_c$,那么需要$out_c$$\times$$in_c$个卷积核。
![多通道卷积](../img/ch02/channels_conv.svg)
:width:`800px`
:label:`channels_conv`
**池化**是常见的降维操作有最大池化和平均池化。池化操作和卷积的执行类似通过池化核、步长、填充决定输出最大池化是在池化核区域范围内取最大值平均池化则是在池化核范围内做平均。与卷积不同的是池化核没有训练参数池化层的填充方式也有所不同平均池化填充的是0最大池化填充的是$-inf$。
图2.3.5是对$4 \times 4$的输入进行$2 \times 2$区域池化步长为2不填充图左边是最大池化的结果右边是平均池化的结果。
:numref:`pooling`是对$4 \times 4$的输入进行$2 \times 2$区域池化步长为2不填充图左边是最大池化的结果右边是平均池化的结果。
![池化操作](../img/ch02/pooling.svg)
:width:`800px`
:label:`pooling`
有了卷积、池化、全连接组件就可以构建一个非常简单的卷积神经网络了,图2.3.6展示了一个卷积神经网络的模型结构。
有了卷积、池化、全连接组件就可以构建一个非常简单的卷积神经网络了, :numref:`nn_network`展示了一个卷积神经网络的模型结构。
给定输入$3 \times 64 \times 64$的彩色图片使用16个$3 \times 3$大小的卷积核做卷积,得到大小为$16 \times 64 \times 64$
再进行池化操作降维,得到大小为$16 \times 32 \times 32$的特征图;
对特征图再卷积得到大小为$32 \times 32 \times 32$特征图,再进行池化操作得到$3 \times 16 \times 16$大小的特征图;
@@ -100,7 +100,7 @@ Transformer又是BERT模型架构的重要组成。随着深度神经网络的
如MindSpore提供的mindspore.nn.Cell、mindspore.nn.Conv2d、mindspore.dataset
PyTorch提供的torch.nn.Module、torch.nn.Conv2d、torch.utils.data.Datset。
图2.3.7描述了神经网络构建过程中的基本细节。
:numref:`model_build`描述了神经网络构建过程中的基本细节。
神经网络层需要的功能有该层的训练参数(变量,包括初始化方法和训练状态)以及计算过程;
神经网络模型需要的功能是对神经网络层管理和神经网络层参数的管理。
在机器学习编程库中承担此功能有MindSpore的Cell、PyTorch的Module。
@@ -113,7 +113,7 @@ Cell和Module是模型抽象方法也是所有网络的基类。
:width:`800px`
:label:`model_build`
图2.3.8展示了设计神经网络层抽象方法的通用表示。通常在构造器会选择使用Python中collections模块的OrderedDict来初始化神经网络层和神经网络层参数的存储它的输出是一个有序的相比与Dict更适合深度学习这种模型堆叠的模式。参数和神经网络层的管理是在\_\_setattr\_\_中实现的当检测到属性是属于神经网络层及神经网络层参数时就记录起来。神经网络模型比较重要的是计算连接过程可以在\_\_call\_\_里重载实现神经网络层时在这里定义计算过程。训练参数的返回接口是为了给优化器传所有训练参数。神经网络层返回为了遍历各层神经网络得到各个神经网络层的参数。这里只列出了一些重要的方法在自定义方法中通常需要实现参数插入删除方法、神经网络层插入删除、神经网络模型信息等。
:numref:`cell_abs`展示了设计神经网络层抽象方法的通用表示。通常在构造器会选择使用Python中collections模块的OrderedDict来初始化神经网络层和神经网络层参数的存储它的输出是一个有序的相比与Dict更适合深度学习这种模型堆叠的模式。参数和神经网络层的管理是在\_\_setattr\_\_中实现的当检测到属性是属于神经网络层及神经网络层参数时就记录起来。神经网络模型比较重要的是计算连接过程可以在\_\_call\_\_里重载实现神经网络层时在这里定义计算过程。训练参数的返回接口是为了给优化器传所有训练参数。神经网络层返回为了遍历各层神经网络得到各个神经网络层的参数。这里只列出了一些重要的方法在自定义方法中通常需要实现参数插入删除方法、神经网络层插入删除、神经网络模型信息等。
![神经网络基类抽象方法](../img/ch02/cell_abstract.svg)
:width:`800px`